From ce70702240c36ec08208792b7d8336ff52198962 Mon Sep 17 00:00:00 2001 From: accura0117 Date: Wed, 25 Mar 2026 19:01:09 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20DB=20=EC=84=A4=EC=A0=95=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC=20=EB=B0=8F=20=EC=84=A4=EC=B9=98=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8=EC=97=90=20Redis/MySQL=20=EC=97=B0=EA=B2=B0?= =?UTF-8?q?=20=EC=B2=B4=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DB 기본값을 ws.ubuilder.co.kr/mos/jsh로 전체 통일 - context-path /spring → / 로 변경 - install.sh/bat에 Redis 자동 시작, MySQL 연결 확인 단계 추가 - health URL /health → /actuator/health 수정 - 개발환경 가이드 문서 동기화 Co-Authored-By: Claude Opus 4.6 (1M context) --- docker-compose-dev.yml | 12 ++--- docker-compose.yml | 10 ++-- docs/개발환경_사전설치_가이드.txt | 16 +++--- scripts/deploy-prod.sh | 2 +- scripts/install.bat | 67 ++++++++++++++++++++---- scripts/install.sh | 59 +++++++++++++++++---- src/main/resources/application-mysql.yml | 6 +-- src/main/resources/application.yml | 8 +-- 8 files changed, 131 insertions(+), 49 deletions(-) diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 39cd9be..38efab9 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -12,9 +12,9 @@ services: ports: - "3306:3306" environment: - MYSQL_DATABASE: wbx_spring - MYSQL_USER: wbxapp - MYSQL_PASSWORD: password + MYSQL_DATABASE: mos + MYSQL_USER: jsh + MYSQL_PASSWORD: jsh@ MYSQL_ROOT_PASSWORD: rootpassword volumes: - mysql_dev:/var/lib/mysql @@ -26,9 +26,9 @@ services: ports: - "5432:5432" environment: - POSTGRES_DB: wbx_spring - POSTGRES_USER: wbxapp - POSTGRES_PASSWORD: password + POSTGRES_DB: mos + POSTGRES_USER: jsh + POSTGRES_PASSWORD: jsh@ volumes: - pg_dev:/var/lib/postgresql/data diff --git a/docker-compose.yml b/docker-compose.yml index e943228..45ced8a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,8 +9,8 @@ services: environment: SPRING_PROFILES_ACTIVE: prod,mysql JWT_SECRET: ${JWT_SECRET} - SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/wbx_spring?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_USERNAME: wbxapp + SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mos?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true + SPRING_DATASOURCE_USERNAME: jsh SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} SPRING_DATA_REDIS_HOST: redis SERVER_CONTEXT_PATH: ${SERVER_CONTEXT_PATH:-/} @@ -21,7 +21,7 @@ services: condition: service_started restart: always healthcheck: - test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] + test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/actuator/health"] interval: 30s timeout: 3s retries: 3 @@ -29,8 +29,8 @@ services: db: image: mysql:8.0 environment: - MYSQL_DATABASE: wbx_spring - MYSQL_USER: wbxapp + MYSQL_DATABASE: mos + MYSQL_USER: jsh MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} ports: diff --git a/docs/개발환경_사전설치_가이드.txt b/docs/개발환경_사전설치_가이드.txt index 3d43e02..b641db0 100644 --- a/docs/개발환경_사전설치_가이드.txt +++ b/docs/개발환경_사전설치_가이드.txt @@ -114,9 +114,9 @@ +------------------+----------+------------------------------------------+ DB 생성 예시 (MySQL): - CREATE DATABASE wbx_spring CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - CREATE USER 'wbxapp'@'localhost' IDENTIFIED BY 'password'; - GRANT ALL ON wbx_spring.* TO 'wbxapp'@'localhost'; + CREATE DATABASE mos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + CREATE USER 'jsh'@'%' IDENTIFIED BY 'jsh@'; + GRANT ALL ON mos.* TO 'jsh'@'%'; [2-3] Redis @@ -155,8 +155,8 @@ docker compose -f docker-compose-dev.yml up -d # 4) .env 파일 수정 (DB 비밀번호를 docker-compose 설정에 맞춤) - # DB_USER=wbxapp - # DB_PASS=password + # DB_USER=jsh + # DB_PASS=jsh@ # JWT_SECRET=dev-secret-key-for-local-development-only # 5) 앱 실행 @@ -164,7 +164,7 @@ ./gradlew bootRun (Linux/macOS) # 6) 확인 - http://localhost:8080/health → {"status":"UP"} + http://localhost:8080/actuator/health → {"status":"UP"} http://localhost:8080/swagger-ui → API 문서 http://localhost:8080/admin/login → 관리 콘솔 @@ -194,9 +194,9 @@ +------------------+--------+----------+------------------------------+ | 서비스 | 포트 | 계정 | 비고 | +------------------+--------+----------+------------------------------+ - | MySQL 8.0 | 3306 | wbxapp | PW: password (기본 프로필) | + | MySQL 8.0 | 3306 | jsh | PW: jsh@ (기본 프로필) | | | | | root PW: rootpassword | - | PostgreSQL 16 | 5432 | wbxapp | PW: password (--profile pg) | + | PostgreSQL 16 | 5432 | jsh | PW: jsh@ (--profile pg) | | Redis 7 | 6379 | - | 인증 없음 (개발용) | +------------------+--------+----------+------------------------------+ diff --git a/scripts/deploy-prod.sh b/scripts/deploy-prod.sh index 7403f5d..acab0b8 100644 --- a/scripts/deploy-prod.sh +++ b/scripts/deploy-prod.sh @@ -208,7 +208,7 @@ echo " [ ] DB 생성 + 사용자 권한 부여" echo " [ ] Redis 설치 + bind 127.0.0.1 + requirepass" echo " [ ] JAR 빌드: ./gradlew bootJar" echo " [ ] 서비스 시작: sudo systemctl start ${SERVICE_NAME}" -echo " [ ] 확인: curl http://localhost:8080/health" +echo " [ ] 확인: curl http://localhost:8080/actuator/health" echo " [ ] 리버스 프록시 설정 (Nginx/Caddy)" echo " [ ] SSL 인증서 설치" echo "==========================================" diff --git a/scripts/install.bat b/scripts/install.bat index cdd73c3..1ea1d22 100644 --- a/scripts/install.bat +++ b/scripts/install.bat @@ -88,8 +88,53 @@ if !ERRORLEVEL! equ 0 ( echo [WARN] Docker 미설치 — DB/Redis를 직접 설치해야 합니다 ) -:: ---------- 4. 빌드 ---------- -echo 4. Gradle 빌드 +:: ---------- 4. Redis 확인 ---------- +echo 4. Redis 확인 +set "REDIS_OK=0" +where redis-cli >nul 2>&1 +if !ERRORLEVEL! equ 0 ( + redis-cli -h localhost -p 6379 ping 2>nul | findstr /i "PONG" >nul 2>&1 + if !ERRORLEVEL! equ 0 ( + echo [OK] Redis 응답 OK + set "REDIS_OK=1" + ) +) +if !REDIS_OK! equ 0 ( + where docker >nul 2>&1 + if !ERRORLEVEL! equ 0 ( + docker ps --format "{{.Names}}" 2>nul | findstr /i "redis" >nul 2>&1 + if !ERRORLEVEL! equ 0 ( + echo [OK] Redis Docker 컨테이너 실행 중 + ) else ( + echo [INFO] Redis 미실행 — Docker로 자동 시작... + docker run -d --name redis -p 6379:6379 redis:7-alpine >nul 2>&1 + if !ERRORLEVEL! equ 0 ( + echo [OK] Redis 컨테이너 시작 완료 + ) else ( + echo [WARN] Redis 자동 시작 실패 — 수동으로 Redis를 실행하세요 + ) + ) + ) else ( + echo [WARN] Redis 연결 불가 — Redis를 설치/실행하세요 + ) +) + +:: ---------- 5. MySQL 연결 확인 ---------- +echo 5. MySQL 연결 확인 +where mysql >nul 2>&1 +if !ERRORLEVEL! equ 0 ( + mysql -h"%DB_HOST%" -P"%DB_PORT%" -u"%DB_USER%" -p"%DB_PASS%" -e "USE %DB_NAME%;" >nul 2>&1 + if !ERRORLEVEL! equ 0 ( + echo [OK] MySQL 연결 OK ^(%DB_USER%@%DB_HOST%:%DB_PORT%/%DB_NAME%^) + ) else ( + echo [WARN] MySQL 연결 실패 — .env 의 DB 설정을 확인하세요 + ) +) else ( + echo [INFO] mysql 클라이언트 없음 — DB 연결은 앱 시작 시 확인됩니다 +) + +:: ---------- 6. 빌드 ---------- +echo 6. Gradle 빌드 if !ERRORS! GTR 0 ( echo [FAIL] 사전 요구사항 미충족 — 빌드 건너뜀 ) else ( @@ -102,8 +147,8 @@ if !ERRORS! GTR 0 ( ) ) -:: ---------- 5. .env 템플릿 ---------- -echo 5. 환경변수 파일 +:: ---------- 7. .env 템플릿 ---------- +echo 7. 환경변수 파일 if not exist "!PROJECT_ROOT!\.env" ( ( echo # ===== WBX Spring Core — 환경변수 ===== @@ -119,11 +164,11 @@ if not exist "!PROJECT_ROOT!\.env" ( echo JWT_SECRET=your-production-secret-key-minimum-256-bits-long echo. echo # --- DB --- - echo DB_HOST=localhost + echo DB_HOST=ws.ubuilder.co.kr echo DB_PORT=3306 - echo DB_NAME=wbx_spring - echo DB_USER=wbxapp - echo DB_PASS=StrongP@ss + echo DB_NAME=mos + echo DB_USER=jsh + echo DB_PASS=jsh@ echo. echo # --- Redis --- echo SPRING_DATA_REDIS_HOST=localhost @@ -160,8 +205,8 @@ if not exist "!PROJECT_ROOT!\.env" ( echo [WARN] .env 이미 존재 — 건너뜀 ) -:: ---------- 6. 디렉토리 ---------- -echo 6. 디렉토리 생성 +:: ---------- 8. 디렉토리 ---------- +echo 8. 디렉토리 생성 if not exist "!PROJECT_ROOT!\logs" mkdir "!PROJECT_ROOT!\logs" if not exist "!PROJECT_ROOT!\uploads" mkdir "!PROJECT_ROOT!\uploads" if not exist "!PROJECT_ROOT!\backup" mkdir "!PROJECT_ROOT!\backup" @@ -177,7 +222,7 @@ if !ERRORS! equ 0 ( echo 1. .env 파일을 환경에 맞게 수정 echo 2. DB 생성 ^(또는 docker compose -f docker-compose-dev.yml up -d^) echo 3. gradlew.bat bootRun - echo 4. http://localhost:8080/health 확인 + echo 4. http://localhost:8080/actuator/health 확인 ) else ( echo 오류 !ERRORS!건 — 위의 [FAIL] 항목을 해결하세요 ) diff --git a/scripts/install.sh b/scripts/install.sh index 9f4c57b..a534992 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -139,8 +139,45 @@ else warn "Docker 미설치 — DB/Redis를 직접 설치해야 합니다" fi -# ---------- 4. 빌드 ---------- -echo "4. Gradle 빌드" +# ---------- 4. Redis 확인 ---------- +echo "4. Redis 확인" +REDIS_HOST="${SPRING_DATA_REDIS_HOST:-localhost}" +REDIS_PORT="${SPRING_DATA_REDIS_PORT:-6379}" +if command -v redis-cli &>/dev/null && redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" ping 2>/dev/null | grep -q PONG; then + ok "Redis 응답 OK ($REDIS_HOST:$REDIS_PORT)" +elif command -v docker &>/dev/null; then + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q redis; then + ok "Redis Docker 컨테이너 실행 중" + else + info "Redis 미실행 — Docker로 자동 시작..." + if docker run -d --name redis -p "${REDIS_PORT}:6379" redis:7-alpine &>/dev/null; then + ok "Redis 컨테이너 시작 완료" + else + warn "Redis 자동 시작 실패 — 수동으로 Redis를 실행하세요" + fi + fi +else + warn "Redis 연결 불가 ($REDIS_HOST:$REDIS_PORT) — Redis를 설치/실행하세요" +fi + +# ---------- 5. MySQL 연결 확인 ---------- +echo "5. MySQL 연결 확인" +DB_HOST="${DB_HOST:-ws.ubuilder.co.kr}" +DB_PORT="${DB_PORT:-3306}" +DB_NAME="${DB_NAME:-mos}" +DB_USER="${DB_USER:-jsh}" +if command -v mysql &>/dev/null; then + if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"${DB_PASS:-}" -e "USE $DB_NAME;" 2>/dev/null; then + ok "MySQL 연결 OK ($DB_USER@$DB_HOST:$DB_PORT/$DB_NAME)" + else + warn "MySQL 연결 실패 — .env 의 DB 설정을 확인하세요" + fi +else + info "mysql 클라이언트 없음 — DB 연결은 앱 시작 시 확인됩니다" +fi + +# ---------- 6. 빌드 ---------- +echo "6. Gradle 빌드" if [ $ERRORS -gt 0 ]; then fail "사전 요구사항 미충족 — 빌드 건너뜀" else @@ -153,8 +190,8 @@ else fi fi -# ---------- 5. .env 템플릿 ---------- -echo "5. 환경변수 파일" +# ---------- 7. .env 템플릿 ---------- +echo "7. 환경변수 파일" if [ ! -f "$PROJECT_ROOT/.env" ]; then cat > "$PROJECT_ROOT/.env" << 'ENVEOF' # ===== WBX Spring Core — 환경변수 ===== @@ -170,11 +207,11 @@ SERVER_CONTEXT_PATH=/ JWT_SECRET=your-production-secret-key-minimum-256-bits-long # --- DB --- -DB_HOST=localhost +DB_HOST=ws.ubuilder.co.kr DB_PORT=3306 -DB_NAME=wbx_spring -DB_USER=wbxapp -DB_PASS=StrongP@ss +DB_NAME=mos +DB_USER=jsh +DB_PASS=jsh@ # --- Redis --- SPRING_DATA_REDIS_HOST=localhost @@ -212,8 +249,8 @@ else warn ".env 이미 존재 — 건너뜀" fi -# ---------- 6. 디렉토리 ---------- -echo "6. 디렉토리 생성" +# ---------- 8. 디렉토리 ---------- +echo "8. 디렉토리 생성" mkdir -p "$PROJECT_ROOT/logs" "$PROJECT_ROOT/uploads" "$PROJECT_ROOT/backup" ok "logs/ uploads/ backup/" @@ -227,7 +264,7 @@ if [ $ERRORS -eq 0 ]; then echo " 1. .env 파일을 환경에 맞게 수정" echo " 2. DB 생성 (또는 docker compose -f docker-compose-dev.yml up -d)" echo " 3. ./gradlew bootRun" - echo " 4. http://localhost:8080/health 확인" + echo " 4. http://localhost:8080/actuator/health 확인" else echo -e " ${RED}오류 ${ERRORS}건 — 위의 [FAIL] 항목을 해결하세요${NC}" fi diff --git a/src/main/resources/application-mysql.yml b/src/main/resources/application-mysql.yml index 882eecf..28a7742 100644 --- a/src/main/resources/application-mysql.yml +++ b/src/main/resources/application-mysql.yml @@ -3,9 +3,9 @@ spring: datasource: - url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wbx_spring}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul - username: ${DB_USER:wbxapp} - password: ${DB_PASS:password} + url: jdbc:mysql://${DB_HOST:ws.ubuilder.co.kr}:${DB_PORT:3306}/${DB_NAME:mos}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul + username: ${DB_USER:jsh} + password: ${DB_PASS:jsh@} driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: ${DB_POOL_SIZE:20} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index dab13a5..d3f6f67 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,9 +17,9 @@ spring: enabled: false # 개발 시 hibernate ddl-auto 사용, 프로덕션 시 true datasource: - url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wbx_spring}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul - username: ${DB_USER:accura} - password: ${DB_PASS:ubuilder0117} + url: jdbc:mysql://${DB_HOST:ws.ubuilder.co.kr}:${DB_PORT:3306}/${DB_NAME:mos}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul + username: ${DB_USER:jsh} + password: ${DB_PASS:jsh@} driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 @@ -35,7 +35,7 @@ server: port: 8080 forward-headers-strategy: native servlet: - context-path: ${SERVER_CONTEXT_PATH:/spring} # 독립 도메인 시 '/' 또는 제거 + context-path: ${SERVER_CONTEXT_PATH:/} # WBX Spring Framework wbx: