Conversation
| server: | ||
| wait-time-in-ms-when-sync-empty: 0 # ?? ????? ??? ?? ??? ?? ?? ?? ?? ?? | ||
| response-cache-update-interval-ms: 30000 # ??????? ??? ??? ?? ??? 30??? ?? |
There was a problem hiding this comment.
아 주석이 ?로 되어있었네요!! 주석 수정해놓았습니다.
우선 wait-time-in-ms-when-sync-empty: 0의 경우 서버가 동작할 때 레지스트리가 비어 있는 상태라면 얼마의 시간동안 응답을 지연할지 정하는 부분입니다. 즉, 0으로 설정할 경우 바로 서비스를 시작한다는 의미입니다.
다음으로 eureka.server.response-cache-update-interval-ms:30000의 경우 유레카 서버가 유지하는 읽기 전용 응답 캐시를 갱신하는 주기입니다. 즉, 등록과 해제가 일어나면 최대 30초 지연될 수 있다는 의미입니다.
WalkthroughCI 파이프라인과 dev/prod CD 워크플로우를 추가했으며, SSH 기반 원격 배포로 docker-compose 재배포를 수행하도록 구성했습니다. Spring Boot 애플리케이션에 Eureka 서버를 활성화하고, 환경별 YAML(profiles)과 테스트 프로필 설정, Dockerfile 및 Gradle 테스트 프로퍼티를 추가/수정했습니다. application.properties의 애플리케이션명은 제거되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Dev as 개발자
participant GH as GitHub Actions
participant Reg as Docker Registry
participant DevHost as DEV_HOST
participant ProdHost as PROD_HOST
Dev->>GH: push/PR to dev 또는 수동 실행
GH->>GH: CI 실행 (checkout → Java/Gradle 빌드)
GH->>Reg: Docker 이미지 빌드 및 푸시
GH-->>GH: workflow_run 완료 -> CD 트리거
rect rgba(200,240,255,0.25)
note over GH,DevHost: CD (dev)
GH->>DevHost: SSH 연결 (appleboy/ssh-action)
DevHost->>DevHost: 컨테이너 강제 제거, docker-compose pull, up --no-deps, 이미지 prune
end
rect rgba(255,235,200,0.25)
note over GH,ProdHost: CD (prod)
GH->>ProdHost: SSH 연결 (appleboy/ssh-action, secrets 사용)
ProdHost->>ProdHost: 컨테이너 강제 제거, docker-compose pull --always-pull, up --no-deps, 이미지 prune
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
Pre-merge checks and finishing touches✅ Passed checks (5 passed)
✨ Finishing touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
build.gradle (1)
3-4: Spring Boot Gradle 플러그인 및 Spring Cloud 릴리스 트레인 버전 정렬
build.gradle 3–4행:
id 'org.springframework.boot' version '3.5.6'로 업데이트io.spring.dependency-management플러그인으로 BOM에spring-cloud-dependencies2025.0.0 (Northfields) 적용
spring-cloud-starter-netflix-eureka-server는 Spring Boot 3.5.x + Spring Cloud 2025.0.x와 호환됩니다.
🧹 Nitpick comments (5)
build.gradle (1)
25-30: Actuator 의존성 추가 권장(운영 관측/헬스체크 대비)헬스 엔드포인트/프로브를 위해 actuator 추가를 권장합니다. 이후 Docker/K8s/Nginx 헬스체크와 연동이 수월해집니다.
다음 변경을 제안합니다:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server' + implementation 'org.springframework.boot:spring-boot-starter-actuator' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' }Dockerfile (1)
1-5: 컨테이너 하드닝 및 종료 시그널 처리 개선
- PID 1이
sh가 아닌 Java가 되도록exec사용 권장.- 기본 PROFILE(예: prod) 지정.
- 루트가 아닌 전용 사용자로 실행.
- 가능하면 JRE/slim 베이스로 경량화(선택).
제안 diff:
-FROM openjdk:21-jdk +FROM openjdk:21-jdk -COPY build/libs/*SNAPSHOT.jar app.jar +# 전용 사용자 생성 +RUN useradd -r -s /bin/false appuser + +# JAR 복사(권한 소유자 지정) +COPY --chown=appuser:appuser build/libs/*SNAPSHOT.jar /app.jar + +# 기본 프로파일 지정(배포 시 PROFILE로 override 가능) +ENV PROFILE=prod -ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Dspring.profiles.active=${PROFILE} -jar /app.jar"] +USER appuser +ENTRYPOINT ["sh", "-c", "exec java ${JAVA_OPTS} -Dspring.profiles.active=${PROFILE} -jar /app.jar"]비고:
- 헬스체크를 사용하려면 actuator 추가 후 오케스트레이터에서
/actuator/health사용을 권장합니다.- prod에서 Eureka 대시보드는 외부 노출을 차단하거나 내부망/접속 제어로 보호하세요(게이트웨이 외부 단일 진입점 유지).
src/test/resources/application-test.yml (1)
1-9: 테스트 포트 충돌 방지 설정 제안통합테스트 시 고정 8080 충돌을 피하려면 랜덤 포트 바인딩을 권장합니다.
다음 변경을 제안합니다:
+server: + port: 0 spring: application: name: discovery-service-test eureka: client: register-with-eureka: false fetch-registry: falsesrc/main/resources/application-local.yml (2)
8-12: Eureka 클라이언트 완전 비활성화 키 추가 권장
register-with-eureka=false,fetch-registry=false와 함께enabled=false를 명시하면 관련 오토컨피그 로깅/네트워크 시도를 줄일 수 있습니다.eureka: client: + enabled: false register-with-eureka: false fetch-registry: false
13-16: 로컬 편의 옵션(선택): 셀프 프리저베이션 해제 등dev/local에서 등록 해제 지연을 최소화하려면 아래를 고려해 볼 수 있습니다(운영에는 비권장).
server: wait-time-in-ms-when-sync-empty: 0 # 초기 레지스트리 정보가 비어 있어도 지연 없이 즉시 서버 시작 response-cache-update-interval-ms: 30000 # 클라이언트에게 제공할 서비스 목록 캐시를 30초마다 갱신 + enable-self-preservation: false # LOCAL 전용 + eviction-interval-timer-in-ms: 5000 # LOCAL 전용
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
.github/workflows/cd-dev.yaml(1 hunks).github/workflows/cd-prod.yaml(1 hunks).github/workflows/ci.yaml(1 hunks)Dockerfile(1 hunks)build.gradle(1 hunks)src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java(1 hunks)src/main/resources/application-dev.yml(1 hunks)src/main/resources/application-local.yml(1 hunks)src/main/resources/application-prod.yml(1 hunks)src/main/resources/application.properties(0 hunks)src/test/resources/application-test.yml(1 hunks)
💤 Files with no reviewable changes (1)
- src/main/resources/application.properties
🔇 Additional comments (2)
build.gradle (1)
38-41: 테스트 프로파일 강제 활성화 👍CI에서 테스트 격리를 보장하므로 적절합니다.
src/main/java/com/unionmate/discovery_service/DiscoveryServiceApplication.java (1)
7-9: Eureka 서버 활성화 적용 적절
@EnableEurekaServer적용이 목적에 부합합니다. 추가 조정 없이도 기본 동작 OK입니다.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
.github/workflows/cd-prod.yaml (1)
18-18: 배포 로그 식별을 위해 스텝 이름을 prod 환경에 맞춰주세요프로덕션 워크플로우인데 스텝 이름이 dev로 남아 있으면 Actions 로그에서 환경을 오해할 수 있습니다.
적용 예시:
- - name: Docker 이미지 dev 서버 배포 + - name: Docker 이미지 prod 서버 배포
Related issue 🛠
작업 내용 💻
스크린샷 📷
local 서버
dev 서버
prod 서버
server { listen 80; server_name 43.200.160.0.nip.io; location /.well-known/acme-challenge/ { root /var/www/certbot; allow all; } location /nginx/health { access_log off; return 200 'ok'; add_header Content-Type text/plain; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; http2 on; server_name 43.200.160.0.nip.io; ssl_certificate /etc/letsencrypt/live/43.200.160.0.nip.io/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/43.200.160.0.nip.io/privkey.pem; # (옵션) mozilla 권장 설정을 쓰고 싶다면 아래 파일들이 있을 때 include # include /etc/letsencrypt/options-ssl-nginx.conf; # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; client_max_body_size 10m; location / { proxy_pass http://gateway-service-prod:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /nginx/health { access_log off; return 200 'ok'; add_header Content-Type text/plain; } }아키텍처
최종적으로 구축한 prod 서버의 아키텍처는 다음과 같습니다.


같이 얘기해보고 싶은 내용이 있다면 작성 📢
Summary by CodeRabbit