배포
1. 프로젝트 루트에서 .\gradlew.bat clean bootJar 실행2. 프로젝트 > build > libs 로 이동 해서 java -jar 프로젝트명-0.0.1-SNAPSHOT.jar 실행
2025.08.31
[N8N]Docker에 설치 후 google 연결
1. 도커 실행2. docker volume create n8n_data3. docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n 4. gcc 접속 > api & service > 사용자 인증 정보 > 상단에 +사용자 인증 정보 만들기 > OAuth 클라이언트 ID > 어플리케이션 생성 하여 시크릿 키와 아이디 입력 > 403 에러 뜰텐데 OAuth 동의 화면 클릭 > 대상 > Add users에 해당 아이디 입력 > 이메일 보내서 excute 하면 보낸 이메일 받아 *이후 구글 스프레드시트 연결하려는데 from list가 안뜨는 이슈가 생김 ~~ 403 , 구글 스프레드 시트만 ..
2025.08.03
파이썬으로 소켓 연결 후 TTS 실행
pip install websocket-clientpip install pyttsx3pip install websockets==10.4 test_server.pyimport asyncioimport websocketsconnected_clients = {}async def handler(websocket, path): print("클라이언트 연결 감지!", path) connected_clients[path] = websocket try: while True: await asyncio.sleep(1) except: del connected_clients[path]async def input_loop(): while True: ..
2025.07.27
FileCountLimitExceededException: attachment
html form에서 form 데이터를 넘기려고 하는데 생긴 에러이다.처음에는 에러 MultipartException이라길래 이미지 첨부해서 생긴 것으로 생각했는데, 이미지 첨부안해도 뜨길래 밑에 더 내려보니 이런 에러가 떴다. 최근에 생긴 것이라 gpt이용해도 답을 찾아낼 수 없었다. 톰캣에서 part 수를 제한해서 생긴 것이다 난 우선 넉넉하게 설정했다.//application.propertiesserver.tomcat.max-part-count=100
2025.07.24
[리액트] C:\Program Files\nodejs\npm.ps1 파일을 로드할 수 없습니다.
npm : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Program Files\nodejs\npm.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오. 위치 줄:1 문자:1 + npm start + ~~~ + CategoryInfo : 보안 오류: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess--------------------------------------------------------------------------------------..
2025.07.17
no image
앱 배포 관련
build.gradle 버전 업 aab 파일 생성Build > Generate Signed Bundle App Bundle / APK.. > Android App Bundle 선택 > Key store password, Key password 입력 (APK는 테스트 용) 03.app > app > release > app_bundle.abb 생성 됨 구글플레이 콘솔 > 테스트 및 출시 > 프로덕션 > 우측 상단 (새버전만들기) > aab 파일 업로드 후 다
2025.07.12
공공데이터 포털 기상정보 코드 변경
기존에 자바스크립트 에서 자바로 로직 변경을 하면서 생긴 오류 정리 ✅ 문제 원인 분석: 왜 String.format()은 실패하고 UriComponentsBuilder는 성공했는가?🔴 이전 방식 (문제 발생)String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 String url = String.format("...serviceKey=%s...", serviceKey); restTemplate.getForObject(url, String.class); // 문제 발생String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 String url = String.format("...serviceKey=%s...", s..
2025.06.11
도커로 OSRM 설치 후 지도 길찾기
docker pull osrm/osrm-backendcd C:\osrmdocker run -t -v %cd%:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/south-korea-latest.osm.pbfdocker run -t -v %cd%:/data osrm/osrm-backend osrm-partition /data/south-korea-latest.osrmdocker run -t -v %cd%:/data osrm/osrm-backend osrm-customize /data/south-korea-latest.osrmdocker run -t -i -p 5000:5000 -v %cd%:/data osrm/osrm-backend osrm-route..
2025.05.28
[POSTGIS]  PSQLException: 오류: "geometry" 자료형 없음
지정된 이름 및 인자 자료형과 일치하는 함수가 없습니다. 명시적 형변환자를 추가해야 할 수도 있습니다.두가지 다 해야한다.1.UPDATE pg_extensionSET extrelocatable = trueWHERE extname = 'postgis';2.ALTER EXTENSION postgisSET SCHEMA "[변경할 스키마명]"
2025.05.24

배포

골드곽
|2025. 8. 31. 22:36
반응형

1. 프로젝트 루트에서 .\gradlew.bat clean bootJar 실행

2. 프로젝트 > build > libs 로 이동 해서 java -jar 프로젝트명-0.0.1-SNAPSHOT.jar 실행

반응형
반응형

 

1. 도커 실행

2.  docker volume create n8n_data

3.  docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

 

4.  gcc 접속 > api & service > 사용자 인증 정보 > 상단에 +사용자 인증 정보 만들기 > OAuth 클라이언트 ID > 어플리케이션 생성 하여 시크릿 키와 아이디 입력 > 403 에러 뜰텐데 OAuth 동의 화면 클릭 > 대상 > Add users에 해당 아이디 입력 > 이메일 보내서 excute 하면 보낸 이메일 받아

 

 

*이후 구글 스프레드시트 연결하려는데 from list가 안뜨는 이슈가 생김 ~~ 403 , 구글 스프레드 시트만 enabled했는데, 구글 드라이브도 해줘야함

반응형
반응형
pip install websocket-client
pip install pyttsx3
pip install websockets==10.4

 

test_server.py

import asyncio
import websockets

connected_clients = {}

async def handler(websocket, path):
    print("클라이언트 연결 감지!", path)
    connected_clients[path] = websocket
    try:
        while True:
            await asyncio.sleep(1)
    except:
        del connected_clients[path]

async def input_loop():
    while True:
        if not connected_clients:
            print("아직 클라이언트가 없습니다. 연결을 기다리는 중...")
            await asyncio.sleep(2)
            continue

        print(f"\n현재 연결된 경로: {list(connected_clients.keys())}")
        target = input("보낼 경로 (예: /ws/store123): ")
        message = input("보낼 메시지: ")
        if target in connected_clients:
            await connected_clients[target].send(message)
            print(f"보냄: {message}")
        else:
            print("해당 경로에 연결된 클라이언트가 없습니다.")

async def main():
    print("WebSocket 서버 실행 중: ws://localhost:8765")
    async with websockets.serve(handler, "localhost", 8765):
        await input_loop()

asyncio.run(main())

 

notify.py(부자연스러운 TTS)

# notifier.py
import websocket
import pyttsx3

def on_message(ws, message):
    print("알림 도착:", message)
    engine = pyttsx3.init()
    engine.say(message)
    engine.runAndWait()

def run_client():
    store_id = "store123"
    ws_url = f"ws://localhost:8765/ws/{store_id}"
    print(f"[연결 시도 중] {ws_url}")
    websocket.WebSocketApp(ws_url, on_message=on_message).run_forever()

if __name__ == "__main__":
    run_client()


notify.py(구글 TTS) -> install gTTS pygame 해야함

import websocket
from gtts import gTTS
import pygame
import os
import time

def speak(message):
    tts = gTTS(text=message, lang='ko')
    filename = "temp.mp3"
    tts.save(filename)

    pygame.mixer.init()
    pygame.mixer.music.load(filename)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        time.sleep(0.1)

    pygame.mixer.quit()
    os.remove(filename)

def on_message(ws, message):
    print("알림 도착:", message)
    speak(message)

def run_client():
    store_id = "store123"
    ws_url = f"ws://localhost:8765/ws/{store_id}"
    print(f"[연결 시도 중] {ws_url}")
    websocket.WebSocketApp(ws_url, on_message=on_message).run_forever()

if __name__ == "__main__":
    run_client()
반응형
반응형

html form에서 form 데이터를 넘기려고 하는데 생긴 에러이다.

처음에는 에러 MultipartException이라길래 이미지 첨부해서 생긴 것으로 생각했는데, 이미지 첨부안해도 뜨길래 밑에 더 내려보니 이런 에러가 떴다.

 

최근에 생긴 것이라 gpt이용해도 답을 찾아낼 수 없었다.

 

톰캣에서 part 수를 제한해서 생긴 것이다 난 우선 넉넉하게 설정했다.

//application.properties
server.tomcat.max-part-count=100

 

 

 

 

반응형

'공부 > SpringBoot' 카테고리의 다른 글

배포  (0) 2025.08.31
Spring Boot에서 FCM 푸시 메세지 전송 방법  (0) 2025.03.20
반응형

npm : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Program Files\nodejs\npm.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.
위치 줄:1 문자:1
+ npm start
+ ~~~
    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

-----------------------------------------------------------------------------------------------------------------------------------------------------------------


vscode > 터미널에서 npm start 했을 때 생긴 오류이다.

윈도우 > PowerShell > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 한 다음 npm start하면 정상 실행 됨

반응형

앱 배포 관련

골드곽
|2025. 7. 12. 14:00
반응형

build.gradle 버전 업

 

aab 파일 생성

Build > Generate Signed Bundle App Bundle / APK.. > Android App Bundle 선택 > 

Key store password, Key password 입력 

(APK는 테스트 용)

 

03.app > app > release > app_bundle.abb 생성 됨

 

구글플레이 콘솔 > 테스트 및 출시 > 프로덕션 > 우측 상단 (새버전만들기) > aab 파일 업로드 후 다

반응형
반응형

기존에 자바스크립트 에서 자바로 로직 변경을 하면서 생긴 오류 정리

 

✅ 문제 원인 분석: 왜 String.format()은 실패하고 UriComponentsBuilder는 성공했는가?

🔴 이전 방식 (문제 발생)

String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 String url = String.format("...serviceKey=%s...", serviceKey); restTemplate.getForObject(url, String.class); // 문제 발생
String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 
String url = String.format("...serviceKey=%s...", serviceKey); 
restTemplate.getForObject(url, String.class); // 문제 발생

⚠ 내부에서 벌어지는 일:

  • RestTemplate은 문자열로 된 URL을 URI 객체로 바꾸면서 다시 인코딩 시도
  • % 문자 자체를 %25로 이중 인코딩하는 경우가 있음
    → iHy%2BX... → iHy%252BX...
  • 공공데이터 API는 이중 인코딩된 키를 '다른 키'로 인식 → 등록되지 않은 키 오류

✅ 현재 방식 (성공)

UriComponentsBuilder.fromHttpUrl(baseUrl)
.queryParam("serviceKey", rawKey) // 디코딩된 원본 키 
...
.build(true) // 인코딩된 상태 그대로 유지!
  • queryParam()은 내부적으로 안전하게 인코딩
  • .build(true)는 쿼리 파라미터를 이중 인코딩하지 않음
  • URI 객체로 완성된 후 RestTemplate은 추가 조작 없이 그대로 전송 → 서버 OK

🧠 핵심 차이점

String.format() vs UriComponentsBuilder
인코딩 처리 수동 (직접 인코딩 필요) 자동 + 안전하게 처리
이중 인코딩 위험 높음 없음 (build(true)로 방지)
실수 확률 높음 (+, %, = 등) 낮음
가독성 낮음 (URL 길고 혼잡) 높음 (명확한 파라미터 명시)
유지보수 어려움 쉬움
 

🚀 성능 비교

String.format() vs UriComponentsBuilder

성능 차이 거의 없음 (100ms 미만 요청에서 무의미한 수준)  
객체 생성 비용 String 조작은 가볍지만 실수 많음 UriComponentsBuilder는 내부적으로 StringBuilder, Map을 사용 → 조금 더 무거움
실제 API 통신 시간 영향 없음 없음
 

📌 요약: 성능 차이는 미미하지만 안정성과 정확성에서는 UriComponentsBuilder가 월등히 우세


⚖️ 장단점 비교 정리

String.format() vs UriComponentsBuilder

 

✅ 장점 코드 간결 (짧게 쓰기 쉬움)
빠르게 테스트용 URL 만들기 편함
안정성, 가독성, 유지보수성 우수
자동 인코딩/검사 처리
이중 인코딩 방지
❌ 단점 이중 인코딩 실수 잦음
디버깅 어렵고 보안 이슈 유발 가능
조금 더 길고 복잡
초보자에겐 생소할 수 있음

✅ 결론

실제 서비스에서는 반드시 UriComponentsBuilder를 사용하는 것이 안정적이고 장기적으로 유지보수에 유리

특히 공공데이터, 외부 API 연동 등 인증 기반 API를 다룰 땐 이중 인코딩 방지가 생명

반응형

'공부 > Java' 카테고리의 다른 글

제네릭 사용이유  (0) 2024.10.02
메모리 가시성  (0) 2024.09.20
스레드 기본 정보  (1) 2024.09.18
스레드 생성과 실행  (0) 2024.09.16
프로세스와 스레드란  (0) 2024.09.16
반응형
docker pull osrm/osrm-backend

cd C:\osrm

docker run -t -v %cd%:/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/south-korea-latest.osm.pbf
docker run -t -v %cd%:/data osrm/osrm-backend osrm-partition /data/south-korea-latest.osrm
docker run -t -v %cd%:/data osrm/osrm-backend osrm-customize /data/south-korea-latest.osrm
docker run -t -i -p 5000:5000 -v %cd%:/data osrm/osrm-backend osrm-routed --algorithm mld /data/south-korea-latest.osrm
반응형
반응형

지정된 이름 및 인자 자료형과 일치하는 함수가 없습니다. 명시적 형변환자를 추가해야 할 수도 있습니다.

두가지 다 해야한다.
1.
UPDATE 
    pg_extension
SET 
    extrelocatable = true
WHERE 
    extname = 'postgis';

2.
ALTER EXTENSION
    postgis
SET SCHEMA
    "[변경할 스키마명]"
반응형

'공부 > DataBase' 카테고리의 다른 글

PostgreSQL 설치  (0) 2024.07.01