1. 프로젝트 루트에서 .\gradlew.bat clean bootJar 실행
2. 프로젝트 > build > libs 로 이동 해서 java -jar 프로젝트명-0.0.1-SNAPSHOT.jar 실행
'공부 > SpringBoot' 카테고리의 다른 글
| FileCountLimitExceededException: attachment (0) | 2025.07.24 |
|---|---|
| Spring Boot에서 FCM 푸시 메세지 전송 방법 (0) | 2025.03.20 |
1. 프로젝트 루트에서 .\gradlew.bat clean bootJar 실행
2. 프로젝트 > build > libs 로 이동 해서 java -jar 프로젝트명-0.0.1-SNAPSHOT.jar 실행
| FileCountLimitExceededException: attachment (0) | 2025.07.24 |
|---|---|
| Spring Boot에서 FCM 푸시 메세지 전송 방법 (0) | 2025.03.20 |
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
| 배포 (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하면 정상 실행 됨
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 파일 업로드 후 다
| [안드로이드] 웹뷰 전체 화면> 상태바, 내비게이션바 설정 (0) | 2025.05.12 |
|---|---|
| [안드로이드] 최신 모바일 기기 상단 상태바 색상 (0) | 2025.05.12 |
| [안드로이드] 웹뷰 카메라, 앨범 사용 (0) | 2025.04.27 |
| [Android] 안드로이드 스프링 부트 session 확인 방법 (0) | 2025.04.12 |
| [Android] FCM 푸시 코드 (1) | 2025.04.10 |
기존에 자바스크립트 에서 자바로 로직 변경을 하면서 생긴 오류 정리
✅ 문제 원인 분석: 왜 String.format()은 실패하고 UriComponentsBuilder는 성공했는가?
🔴 이전 방식 (문제 발생)
String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키
String url = String.format("...serviceKey=%s...", serviceKey);
restTemplate.getForObject(url, String.class); // 문제 발생
✅ 현재 방식 (성공)
UriComponentsBuilder.fromHttpUrl(baseUrl)
.queryParam("serviceKey", rawKey) // 디코딩된 원본 키
...
.build(true) // 인코딩된 상태 그대로 유지!
🧠 핵심 차이점
| 인코딩 처리 | 수동 (직접 인코딩 필요) | 자동 + 안전하게 처리 |
| 이중 인코딩 위험 | 높음 | 없음 (build(true)로 방지) |
| 실수 확률 | 높음 (+, %, = 등) | 낮음 |
| 가독성 | 낮음 (URL 길고 혼잡) | 높음 (명확한 파라미터 명시) |
| 유지보수 | 어려움 | 쉬움 |
🚀 성능 비교
| 성능 차이 | 거의 없음 (100ms 미만 요청에서 무의미한 수준) | |
| 객체 생성 비용 | String 조작은 가볍지만 실수 많음 | UriComponentsBuilder는 내부적으로 StringBuilder, Map을 사용 → 조금 더 무거움 |
| 실제 API 통신 시간 영향 | 없음 | 없음 |
📌 요약: 성능 차이는 미미하지만 안정성과 정확성에서는 UriComponentsBuilder가 월등히 우세
⚖️ 장단점 비교 정리
| ✅ 장점 | 코드 간결 (짧게 쓰기 쉬움) 빠르게 테스트용 URL 만들기 편함 |
안정성, 가독성, 유지보수성 우수 자동 인코딩/검사 처리 이중 인코딩 방지 |
| ❌ 단점 | 이중 인코딩 실수 잦음 디버깅 어렵고 보안 이슈 유발 가능 |
조금 더 길고 복잡 초보자에겐 생소할 수 있음 |
✅ 결론
실제 서비스에서는 반드시 UriComponentsBuilder를 사용하는 것이 안정적이고 장기적으로 유지보수에 유리
특히 공공데이터, 외부 API 연동 등 인증 기반 API를 다룰 땐 이중 인코딩 방지가 생명
| 제네릭 사용이유 (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
"[변경할 스키마명]"| PostgreSQL 설치 (0) | 2024.07.01 |
|---|