Skip to content

Conversation

@Hexeong
Copy link
Contributor

@Hexeong Hexeong commented Dec 26, 2025

관련 이슈

작업 내용

  • dev/prod 환경에 대해서 기존 사이드 인프라를 배포하던 docker-compose.yml을 스프링 부트 앱만 배포하도록 수정
  • dev/prod 환경에 대해서 배포 시 github action 작업 중 사이드 인프라 관련 step을 제거/수정

특이 사항

  1. docker-compose로 배포하는 컨테이너가 1개여서 쉘 스크립트 명령어로 바꿔 scp 스텝을 지울 수도 있지만, 현재 IaC를 지향하고 있기에 인프라 스펙을 Code로써 정의해두는 게 더 좋다고 느껴 일단 docker-compose를 사용하는 현재 체제를 유지했습니다!
  2. 또한 cd.yml은 배포에 대한 책임을, docker-compose는 인프라 스펙 정의에 대한 책임으로 서로 역할 분리를 통해 협업간 이점이 있지 않을까 합니다 ㅎㅎ
  3. 이 부분에 대해서 의견 있으시다면 가감없이 편하게 말씀해주시면 감사드리겠습니다~!

리뷰 요구사항 (선택)

  • 스프링 부트 앱 배포(깃헙 액션)와 사이드 인프라 배포(테라폼)이 서로 다르게 실행되기 때문에 같은 network 상에서 묶여야 통신이 가능할 것 같습니다!
  • 하지만 제가 생각했을 때, 굳이 network를 생성하지 않고 host의 네트워크를 그대로 쓰게 해도 문제가 없을 것 같고, 더욱이 중간에서 default 네트워크를 이용하지 않기에 미묘한 성능향상(?)이 있을 거라 생각해서 host 네트워크로 설정했습니다!
  • 해당 부분에 대해서 괜찮은지에 대해서도 의견 주시면 감사드리겠습니다~

@coderabbitai
Copy link

coderabbitai bot commented Dec 26, 2025

Walkthrough

  1. 서비스 제거: 개발 및 프로덕션 docker-compose에서 redis, redis-exporter, alloy 서비스를 완전히 제거했습니다.
  2. 네트워크 및 포트 변경: solid-connection 서비스에 network_mode: "host"를 적용하고, 호스트 포트 매핑을 제거했습니다.
  3. Redis 호스트 설정 변경: SPRING_DATA_REDIS_HOST 값을 "redis"에서 "127.0.0.1"로 변경했습니다.
  4. 재시작 정책 추가: 남아있는 서비스들에 restart: always 정책을 추가했습니다.
  5. CI/CD 단순화: 배포 시 로컬 설정 파일(config.alloy, nginx.*.conf) 전송 및 원격 적용 단계를 제거하고, 원격에서 GHCR 로그인 → 이미지 풀 → docker-compose down || true 및 docker-compose up --detach로 앱 재시작하도록 흐름을 정리했습니다.
  6. 레지스트리/이미지 정리: dangling 이미지 프루닝과 오래된 태그 이미지 제거 절차를 CI/CD에 추가했습니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • wibaek
  • whqtker
  • JAEHEE25
  • lsy1307
  • sukangpunch
  • Gyuhyeok99

Pre-merge checks and finishing touches

✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 변경의 핵심을 명확하게 요약하고 있으며, 사이드 인프라 배포 과정의 분리라는 주요 변경사항을 잘 나타냅니다.
Description check ✅ Passed PR 설명은 템플릿을 따르고 있으며, 관련 이슈, 작업 내용, 특이사항, 리뷰 요구사항을 충분히 포함하고 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경사항이 이슈 #591의 목표인 사이드 인프라 분리를 충족하고 있습니다. dev/prod 환경의 docker-compose.yml 수정, GitHub Actions 워크플로우 개선, 역할 분리가 완벽하게 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 이슈 #591의 범위 내에 있으며, 사이드 인프라(Redis, Redis-Exporter, Alloy) 분리와 배포 프로세스 개선으로 제한되어 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
.github/workflows/prod-cd.yml (1)

149-153: 2. 재시작 로직의 에러 처리 및 헬스체크

docker compose down || true 패턴을 사용하여 컨테이너가 실행 중이지 않을 때의 실패를 방지한 것은 좋지만, 다음 사항들을 고려해 주세요:

  • 에러 마스킹: || true로 인해 실제 문제가 발생해도 감춰질 수 있습니다.
  • 배포 검증 부재: 재시작 후 애플리케이션이 정상적으로 시작되었는지 확인하는 헬스체크가 없습니다. 배포 실패 시 롤백 메커니즘도 고려가 필요합니다.
🔎 헬스체크를 추가하는 개선안

재시작 후 다음과 같은 헬스체크를 추가할 수 있습니다:

            OWNER_LOWERCASE=$OWNER_LOWERCASE IMAGE_TAG=$IMAGE_TAG_ONLY docker compose -f docker-compose.prod.yml up -d
          
+           # 4. 헬스체크
+           echo "Waiting for application to be healthy..."
+           for i in {1..30}; do
+             if curl -f http://localhost:8080/actuator/health > /dev/null 2>&1; then
+               echo "Application is healthy!"
+               break
+             fi
+             if [ $i -eq 30 ]; then
+               echo "Health check failed after 30 attempts"
+               exit 1
+             fi
+             echo "Attempt $i/30: Application not ready yet..."
+             sleep 2
+           done
+         
-           # 6. 정리
+           # 5. 정리
            docker image prune -f
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1f12fea and d2cc19e.

📒 Files selected for processing (4)
  • .github/workflows/dev-cd.yml
  • .github/workflows/prod-cd.yml
  • docker-compose.dev.yml
  • docker-compose.prod.yml
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-25T10:59:42.734Z
Learnt from: whqtker
Repo: solid-connection/solid-connect-server PR: 481
File: docs/infra-config/nginx.conf:36-36
Timestamp: 2025-08-25T10:59:42.734Z
Learning: When using network_mode: host in Docker Compose, containers share the host's network namespace, so nginx proxy_pass should target localhost:PORT instead of container service names like solid-connection-server:PORT.

Applied to files:

  • docker-compose.prod.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (11)
docker-compose.prod.yml (3)

14-14: 2. 재시작 정책 추가

restart: always 정책을 추가한 것은 프로덕션 환경의 안정성을 높이는 좋은 개선입니다!


7-11: 호스트 네트워킹 전환 및 Redis 외부 배포 설정 검증 필요

프로덕션 환경 docker-compose 파일의 주요 구조 변경에 대해 다음 항목들을 확인해 주세요:

  1. Redis 가용성 검증

    • Redis가 실제로 호스트의 127.0.0.1:6379에서 실행 중인지 확인 필요
    • 로컬 개발 환경(docker-compose.local.yml)과 달리, 프로덕션에서는 Redis가 Docker 컨테이너 외부에서 독립 실행되어야 함
  2. 포트 노출 및 방화벽 규칙 확인

    • network_mode: "host" 사용으로 컨테이너의 모든 포트(8080, 8081 등)가 호스트에 직접 노출됨
    • 방화벽 규칙이 필요한 포트만 허용하도록 적절히 구성되었는지 검증
  3. 네트워크 격리 손실에 따른 보안 검토

    • Docker 네트워크 격리가 완전히 우회되므로 보안 영향도 평가 필요
    • 호스트 머신의 다른 서비스와의 포트 충돌 가능성 검토

1-14: 3. 제거된 사이드 인프라 서비스 검증 필요

Docker Compose에서 Redis, Redis-Exporter, Alloy 서비스가 제거되었습니다. 이 서비스들이 호스트에 별도로 배포되어 정상 동작하는지 확인이 필요합니다:

  • Redis: 데이터 영속성 및 백업 설정
  • Redis-Exporter: 모니터링 메트릭 수집
  • Alloy: 로그 및 메트릭 집계

Spring Boot 앱이 시작될 때 이러한 의존성 서비스들이 준비되지 않으면 연결 실패가 발생할 수 있습니다.

다음 스크립트로 사이드 인프라가 호스트에서 실행 중인지 확인할 수 있습니다:

#!/bin/bash
# Description: Verify side infrastructure services are running on host

echo "=== Checking Redis service ==="
systemctl status redis 2>/dev/null || systemctl status redis-server 2>/dev/null || echo "Redis service not found via systemctl"

echo -e "\n=== Checking Redis-Exporter ==="
ps aux | grep -i redis.*exporter | grep -v grep

echo -e "\n=== Checking Alloy ==="
ps aux | grep -i alloy | grep -v grep

echo -e "\n=== Checking listening ports ==="
ss -tlnp | grep -E ':(6379|9121|12345)\s'
docker-compose.dev.yml (3)

14-14: 2. 재시작 정책 추가

개발 환경에도 restart: always 정책을 추가하여 안정성을 높인 점이 좋습니다!


1-14: 3. 사이드 인프라 분리 확인

프로덕션과 마찬가지로 Redis, Redis-Exporter, Alloy가 제거되었습니다. 개발 서버에 이들이 별도로 배포되어 있는지 확인이 필요합니다.


7-11: 호스트 네트워킹 및 Redis 연결 설정 확인 (개발 환경)

변경사항 확인:

  1. network_mode: "host" 적용
  2. SPRING_DATA_REDIS_HOST127.0.0.1 변경
  3. SPRING_DATA_REDIS_PORT6379 설정
  4. restart: always 정책 적용

개발 환경 구성 시 다음 사항을 확인해 주세요:

  • Redis가 로컬 시스템의 127.0.0.1:6379에서 정상 실행 중인지 확인
  • 호스트 네트워킹 모드 사용으로 인한 포트 충돌 가능성 검토
.github/workflows/prod-cd.yml (2)

143-148: 1. 이미지 풀 단계

GHCR 로그인 및 이미지 풀 로직이 올바르게 구현되었습니다. 워크플로우 토큰을 사용하여 인증하는 방식이 적절합니다.


119-128: 설정 파일 전송 로직 누락 확인

docs/infra-config 디렉토리에 nginx.prod.confconfig.alloy 파일이 존재하고, 워크플로우에서 이들이 체크아웃되고 있으나(라인 110-116), 실제 배포 단계에서는 docker-compose.prod.yml만 서버로 전송되고 있습니다(라인 124-127). SSH 단계의 "apply nginx config" 스텝도 실제로는 Docker Compose 재시작만 수행할 뿐 해당 설정 파일들을 적용하지 않습니다.

배포 전에 다음을 확인하세요:

  1. 프로덕션 서버의 Nginx 설정 파일(/etc/nginx/sites-available/ 등)이 최신 상태인지
  2. Alloy 설정 파일이 서버에 존재하고 최신 버전인지
  3. 설정 변경 시 별도의 수동 배포 프로세스나 관리 절차가 마련되어 있는지
.github/workflows/dev-cd.yml (3)

127-130: 1. 이미지 풀 단계

GHCR 로그인 및 이미지 풀 로직이 올바르게 구현되었습니다.


138-147: 3. 이미지 정리 로직

개발 환경에 대한 이미지 정리 로직이 잘 구현되었습니다:

  • Dangling 이미지 제거
  • 최근 5개 태그를 제외한 이전 이미지 제거

|| true로 정리 실패 시에도 배포가 계속 진행되도록 한 점이 적절합니다.


103-111: 4. 설정 파일 전송 제거 확인

프로덕션과 마찬가지로 Alloy 및 Nginx 설정 파일 전송이 제거되었습니다. 개발 서버에 해당 설정들이 사전 배포되어 있는지 확인이 필요합니다.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
.github/workflows/dev-cd.yml (2)

132-136: 배포 후 헬스체크 추가를 권장합니다.

현재 구현은 컨테이너를 재시작하지만 정상 구동 여부를 확인하지 않습니다.

다음과 같은 검증 단계를 추가하면 배포 신뢰성을 높일 수 있습니다:

  1. docker compose ps로 컨테이너 상태 확인
  2. 로그를 통해 애플리케이션 시작 메시지 확인
  3. 헬스 엔드포인트에 대한 간단한 HTTP 요청 (예: curl -f http://localhost:8080/actuator/health)

배포가 실패했을 때 즉시 감지할 수 있어 롤백이나 디버깅이 용이해집니다.

🔎 헬스체크 추가 예시
 OWNER_LOWERCASE=$OWNER_LOWERCASE IMAGE_TAG=$IMAGE_TAG_ONLY docker compose -f docker-compose.dev.yml up -d
+
+# 5. 배포 검증
+echo "Verifying deployment..."
+sleep 10
+if docker compose -f docker-compose.dev.yml ps | grep -q "Up"; then
+  echo "Deployment verification passed."
+else
+  echo "Deployment verification failed. Containers not running properly."
+  docker compose -f docker-compose.dev.yml logs --tail=50
+  exit 1
+fi

142-147: 이미지 정리 로직에 안전장치를 추가할 수 있습니다.

현재 로직은 잘 작동하지만, 정리할 이미지가 5개 이하인 경우를 더 명확하게 처리할 수 있습니다.

🔎 개선된 정리 로직 예시
-echo "Cleaning up old tagged images (keeping last 5)..."
-IMAGE_NAME_BASE="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev"
-docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \
-sort -r | \
-tail -n +6 | \
-xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true
+echo "Cleaning up old tagged images (keeping last 5)..."
+IMAGE_NAME_BASE="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev"
+OLD_IMAGES=$(docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | sort -r | tail -n +6)
+if [ -n "$OLD_IMAGES" ]; then
+  echo "Removing old images: $OLD_IMAGES"
+  echo "$OLD_IMAGES" | xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true
+else
+  echo "No old images to clean up (less than 6 images found)."
+fi

현재 구현도 충분히 안전하게 동작하므로 선택적으로 적용하시면 됩니다.

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d2cc19e and e2b1ec4.

📒 Files selected for processing (1)
  • .github/workflows/dev-cd.yml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (3)
.github/workflows/dev-cd.yml (3)

114-114: 스텝 이름이 더 명확해졌습니다.

배포 작업의 의도가 잘 드러나는 네이밍입니다.


123-124: 환경 변수 전달 문제가 해결되었습니다.

이전 리뷰에서 지적되었던 OWNER_LOWERCASE 누락 이슈가 수정되었습니다.

  1. Line 123-124에서 필요한 환경 변수들을 export하고
  2. Line 136에서 docker compose 명령 실행 시 명시적으로 전달하고 있어

docker-compose.dev.yml이 요구하는 변수들을 정상적으로 사용할 수 있습니다.

Also applies to: 136-136


135-135: 에러 처리 전략을 확인해 주세요.

|| true를 사용하여 docker compose down 실패를 무시하고 있습니다.

첫 배포 시 중단할 컨테이너가 없는 경우를 대비한 것으로 보이지만, 이로 인해 다음과 같은 실제 문제들도 감춰질 수 있습니다:

  1. docker-compose.dev.yml 파일 문법 오류
  2. Docker 데몬 권한 문제
  3. 네트워크나 볼륨 관련 충돌

더 명확한 에러 처리를 원하신다면 다음과 같은 접근을 고려해 보세요:

# 컨테이너가 존재하는 경우에만 down 실행
if docker compose -f docker-compose.dev.yml ps -q | grep -q .; then
  docker compose -f docker-compose.dev.yml down
fi

현재 방식을 의도적으로 선택하신 것이라면 괜찮습니다.

Copy link
Contributor

@Gyuhyeok99 Gyuhyeok99 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다~
궁금한 점들은 회의 때 다 말씀주셔서 문제 없을 거 같습니다!

@Hexeong Hexeong merged commit c30edc7 into solid-connection:develop Dec 27, 2025
2 checks passed
whqtker added a commit that referenced this pull request Jan 19, 2026
* fix: yml 들여쓰기 수정 (#555)

* fix: yml 들여쓰기 수정

* fix: jdk 변경

* refactor: 멘토 및 채팅 관련 API 응답 수정 (#537)

* refactor: 멘토의 멘토링 조회 응답에서 mentoringId가 아니라 roomId를 포함하도록

* refactor: 파트너가 멘토인 경우 partnerId는 mentorId로

- AS IS: 멘토/멘티 모두 partnerId가 siteUserId
- TO BE: 멘티: siteUserId, 멘토: mentorId

* refactor: 응답의 senderId가 mentorId/siteUserId가 되도록

* refactor: senderId에 해당하는 chatParticipant가 없을 경우 예외 처리하는 로직 추가

* refactor: 메서드명에 맞게 시그니처 변경

* refactor: getChatMessages 메서드에서 응답으로 siteUserId를 넘겨주도록

- AS IS: mentorId(mentor) / siteUserId(mentee)
- TO BE: siteUserId(all)

* refactor: 헬퍼 메서드로 메서드 복잡성을 분산한다

* refactor: getChatPartner 메서드의 응답으로 siteUserId를 넘겨주도록

- AS IS: mentorId(mentor) / siteUserId(mentee)
- TO BE: siteUserId(all)

* refactor: CD 성능 개선 (#552)

* fix: deprecated된 base image를 eclipse-temurin:17-jdk로 변경

* refactor: scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 변경

* fix: GHCR image 제거시 Org의 GITHUB_TOKEN 사용하도록 변경

* refactor : scp 파일 전송하는 방식에서 GHCR로 push/pull하도록 prod-cd.yml과 docker-compose.prod.yml 변경

* fix: prod 인스턴스 old image 이름 통일

* fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정

* fix: prod-cd.yml StrictHostKeyChecking 옵션 문법 오류 수정

* fix: dev-cd.yml Old images 정리 작업 중 이미지 이름 불일치 문제 해결

* chore: 마지막 줄 개행 추가

* chore: 마지막 줄 개행 추가

* feat: stage 인스턴스에 대한 최신 이미지 5개 유지 기능 및 old 이미지 제거 기능 추가

* chore: 중복된 환경변수 지정 제거

* chore: 중복된 pem키 생성 로직 제거

* fix: 잘못된 pem키 이름 수정

* refactor: 원격 호스트에서 pull할 경우, 최소 권한으로 실행하도록 Github App으로 임시토큰 발급하도록 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 (#565)

* fix: GitHub app token permission 문제 해결 (#566)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: GitHub app token permission 문제 오류 해결 (#567)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: GitHub app token permission이 repo 레벨에서 부여되는 문제 해결 (#568)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: GitHub app token permission 권한 오류 해결 (#569)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정

* refactor: test용 설정 제거

* feat: claude.md 파일 추가 (#560)

* fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정 (#563)

* fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정
- UK 제약조건 추가
- flyway script 추가
- CustomException 추가
- Service 로직 수정
- Test code 추가

* fix : column명 오류 수정
- column명 camelCase -> snake_case로 변경

* fix : column명 오류 수정
- column명 name으로 명시

* fix: GitHub app token permission 권한 오류 해결 (#570)

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 문법 오류 수정

* fix: Github App이 발행한 임시 토큰에 대해 Contents 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* fix: Github App이 발행한 임시 토큰에 대해 조직 레벨에서 읽기 권한 추가

* test: fork repo의 작업 branch에서 해당 workflows가 실행되도록 임시 수정

* refactor: test용 설정 제거

* fix: docker login username 불일치 문제

* refactor: 최소권한 원칙 적용을 위한 Action Job 분리

* refactor: 필요없는 주석 제거

* fix: GHCR 정리 권한 PAT로 해결 (#573)

* feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가 (#562)

* feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가

* refactor: submitMentorApplication 메서드의 멘토 지원 유효 검증 부분을 메서드로 추출

* refactor: MentorMyPage 생성, 수정 부분의 channel 생성, 업데이트 부분 중복 제거

* test: Mentor 생성 관련 테스트 추가

* fix: 코드래빗 리뷰 적용

* refactor: 멘토 생성 시 channelRequest가 null 일 떄 예외 처리

* feat: MentorApplicationRequest 필드에 유효성 어노테이션 추가

* test: 채널 검색 시 siteUserId로 조회하는 문제 해결

* fix: 리뷰 수정사항 적용

* fix: 파일 끝에 개행 추가

* refactor: 멘토 생성 메서드에서 siteUser의 검증 제외

* refactor: dto 단에서 채널 리스트 null 검증

* feat: MentorApplication에 termId 추가 flyway 스크립트 추가

* fix: flyway 버전 충돌 해결

* feat: 어드민 멘토 승격 요청 페이징 조회 기능 추가 (#576)

* feat: 어드민 멘토 지원서 페이징 조회 기능 추가

* feat: mentor/repository 패키지에 custom 패키지 추가

- custom 패키지에 페이징 조회를 책임지는 MentorApplicationFilterRepository 추가

- MentorApplicationSearchCondition 에서 넘긴 keyword 기반으로 닉네임, 권역, 나라, 학교명으로 필터링 검색 기능 추가

- MentorApplicationSearchCondition 에서 넘긴 mentorApplicationStatus 기반으로 승인, 거절, 진행중 으로 필터링 기능 추가

* test: 어드민 멘토 지원서 페이징 조회 테스트 추가

* feat: MentorApplication 엔티티에 approved_at 필드 추가 flyway 스크립트 작성

* fix: 파일 끝에 개행 추가

* refactor: 페이징 조회 시 count 쿼리에 불필요한 조인 막기

* fix: 코드래빗 리뷰 적용

* fix: flyway V39 스크립트 파일명 수정

* test: 테스트 코드 오류 수정, 검증 추가  

* test: 기대하는 값이랑 다른 테스트 응답을 수정합니다

* feat: 어드민 멘토 승격 지원서 승인/거절 기능, 상태 별 지원서 개수 조회 기능 추가 (#577)

* feat: 어드민 멘토 승격 지원서 승인/거절 기능 추가

* test: 어드민 멘토 지원서 승인/거절 테스트 추가

* feat: 멘토 지원서 상태별 개수 조회 기능 추가

* test: 멘토 지원서 상태별 개수 조회 테스트 추가

* fix: 대학이 선택되지 않은 멘토 지원서 승인 시 예외 발생하도록 수정

* refactor: 리뷰 내용 반영

* refactor: MENTOR_APPLICATION_ALREADY_CONFIRM -> MENTOR_APPLICATION_ALREADY_CONFIRMED 로 수정

* refactor: 멘토 지원서 거절 사유 관련하여 기획에 명시되지 않은 길이 제한 제거

* refactor: 리뷰 적용

* refactor: 변수명, 필드명 일관성 맞추기

* test: assertAll 적용

* feat: region 관련 관리 기능 추가 (#561)

* feat: 지역 생성 기능 구현 (AdminRegion)

지역을 생성하는 기능을 구현했습니다:
- AdminRegionCreateRequest: 지역 생성 요청 DTO
- AdminRegionResponse: 지역 응답 DTO
- AdminRegionService.createRegion(): 중복 검사를 포함한 지역 생성 로직
- AdminRegionController.createRegion(): HTTP POST 엔드포인트

중복 검사:
- 지역 코드 중복 확인
- 한글명 중복 확인

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* feat: 지역 수정/삭제/조회 기능 구현 및 테스트 추가 (AdminRegion)

지역 관리 기능을 완성했습니다:

구현 기능:
- AdminRegionUpdateRequest: 지역 수정 요청 DTO
- AdminRegionService.updateRegion(): 한글명 중복 검사를 포함한 지역 수정
- AdminRegionService.deleteRegion(): 지역 삭제
- AdminRegionService.getAllRegions(): 전체 지역 조회
- AdminRegionController: 수정/삭제/조회 HTTP 엔드포인트

테스트 코드 (AdminRegionServiceTest):
- CREATE: 정상 생성, 코드 중복, 한글명 중복 테스트
- UPDATE: 정상 수정, NOT_FOUND, 중복 한글명, 동일 한글명 테스트
- DELETE: 정상 삭제, NOT_FOUND 테스트
- READ: 빈 목록, 전체 조회 테스트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* fix: 지역 관리 관련 에러코드 추가 (ErrorCode)

지역 관리 기능에 필요한 에러코드를 추가했습니다:
- REGION_NOT_FOUND: 존재하지 않는 지역
- REGION_ALREADY_EXISTS: 이미 존재하는 지역

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>

* fix: jpa 오류 수정

* refactor: 코드리뷰 반영

---------

Co-authored-by: Claude <[email protected]>

* fix: config.alloy 파일 경로 불일치 문제 해결 (#586)

* fix: config.alloy 파일 경로 불일치 문제 해결

* refactor: docker-compose를 수정하는게 아닌 cd.yml의 경로를 수정하여 해결

* feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없다. (#582)

* feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없도록

* test: 소셜 로그인 사용자 비밀번호 변경 관련 테스트 코드 작성

* chore: 컨벤션에 맞게 메서드명 변경

- ~~ 예외가 발생한다

* chore: 충돌 해결

* fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록 (#581)

* fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록

- Upgrade 헤더가 존재하면(e.g. WebSocket) upgrade로 설정
- Upgrade 헤더가 존재하지 않으면 keep-alive로 설정

* chore: 서브모듈 업데이트

* feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 (#583)

* feat: 멘토 지원서 검색 조건에 UniversitySelectType 추가

* feat: 어드민 멘토 지원서 페이징 조회 응답에 UniversitySelectType 추가

* test: 멘토 지원서 조회 테스트 추가

- test: UniversitySelectType 기반 페이징 조회 테스트 추가

* feat: 멘토 지원서에 대학 매핑 기능 추가

* test: 멘토 지원서 대학 매핑 테스트 추가

* refactor: 의미 없는 import 제거

* refactor: 리뷰 내용 반영

* refactor: 개행 및 공백 추가

* refactor: pathVariable 네이밍을 kebab-case 로 통일

* refactor: Service 레이어의 검증 로직을 도메인으로 이동

* refactor: PENDING 상태 및 OTHER 타입 검증을 도메인 메서드로 관리

* refactor: assignUniversity() 호출 전 검증 책임을 도메인 엔티티에 위임

* test : assertAll 로 검증 그룹화

* refactor: 스프링 부트 앱 외의 사이드 인프라 배포 과정을 분리 (#592)

* refactor: dev 환경에서의 side-infra 배포 과정 분리

* refactor: prod 환경에서의 side-infra 배포 과정 분리

* refactor: docker-compose 가 실행되고 있지 않아도 스크립트가 실패하지 않게 변경

* fix: docker compose up 시에 사용할 환경변수 중 누락된 변수를 추가

* fix: S3 이름 불일치 문제 해결 (#594)

* fix: s3 이름 불일치 문제 해결

* fix: s3와의 연동된 cloudfront URL로 수정

* refactor: 분리한 사이드 인프라에 대해서 필요없는 파일 정리 (#596)

* test: flyway 스크립트를 검증하는 테스트 코드 작성 (#588)

* test: flyway 스크립트를 검증하는 테스트 코드 작성

* fix: DirtiesContext 어노테이션을 통해 기존 컨텍스트를 폐기하도록

- 새로운 MySQL 환경에서 마이그레이션이 이루어지도록 수정

* fix: flyway 검증용의 별도의 MySQL 컨테이너를 사용하도록

* chore: 테스트 의도를 쉽게 이해할 수 있도록 주석 추가

* chore: 명시적으로 컨테이너를 시작하도록

- 또한 MySQLTestContainer 코드와 유사한 컨벤션을 가지도록 수정

* refactor: 게시글 조회 응답에 댓글 deprecated 여부 포함하도록 (#599)

* feat: 유저의 멘토 지원서 신청 이력 조회 기능 추가 (#603)

* feat: 유저의 멘토 지원 이력 조회 기능 추가

* refactor: 매개변수 타입 통일

* refactor: long 타입을 Long 으로 수정

* test: 멘토 지원서 이력 조회 테스트 추가

* test: MentorApplicationFixtureBuilder 에 rejectedReason 필드 및 빌더 메서드 추가

* refactor: 리뷰 사항 적용

* test: 멘토 지원서 이력 조회 에서 user와 university 재사용

* refactor: 긴 uri 를 짧게 수정

* refactor: 서브모듈 해시값 되돌리기

* refactor: 개행 지우기

* refactor: applicationOrder 자료형을 long 으로 수정

* fix: applicationOrder 를 int 자료형으로 처리하도록 복구

- 순서를 나타내고, 해당 값이 21억을 넘길 수 없다 판단하여 더 적합한 int 자료형으로 복구

* test: long type 을 기대하던 테스트 에러 해결

* fix: 탈퇴한 사용자가 물리적 삭제가 되지 않았던 문제를 해결한다 (#574)

* refactor: FK에 ON DELETE CASCADE 옵션 추가

* refactor: 삭제 메서드로 사용자 연관 데이터를 삭제하도록

* feat: 어드민 유저 차단 기능 추가 (#604)

* feat: 어드민 차단 기능

* test: 어드민 차단 기능

* feat: API 성능 로깅, 쿼리 별 메트릭 전송 추가 (#602)

* feat: HTTP 요청/응답 로깅 필터 구현

- traceId 기반 요청 추적
- 요청/응답 로깅
- CustomExceptionHandler와 중복 로깅 방지
- Actuator 엔드포인트 로깅 제외

* feat: ExceptionHandler에 중복 로깅 방지 플래그 및 userId 로깅 추가

* feat: API 수행시간 로깅 인터셉터 추가

* feat: ApiPerf 인터셉터, Logging 필터 빈 등록

* refactor: logback 설정 변경

- info, warn, error, api_perf 로 로그 파일 분리해서 관리

* feat: 쿼리 별 수행시간 메트릭 모니터링 추가

* feat: 데이터소스 프록시 의존성 및 config 파일 추가

* feat: 데이터 소스 프록시가 metric을 찍을 수 있도록 listener 클래스 추가

* feat: 요청 시 method, uri 정보를 listener에서 활용하기 위해 RequestContext 및 관련 interceptor 추가

* refactor: 비효율적인 Time 빌더 생성 개선

- Time.builder 를 사용하면 매번 빌더를 생성하여 비효율적인 문제를 meterRegistry.timer 방식으로 해결

* feat: 로깅을 위해 HttpServeletRequest 속성에 userId 추가

* refactor: logback 설정 중 local은 console만 찍도록 수정

* refactor: FILE_PATTERN -> LOG_PATTERN 으로 수정

* test: TokenAuthenticationFilter에서 request에 userId 설정 검증 추가

- principal 조회 예외를 막기 위해 siteUserDetailsService given 추가

* refacotr: 코드 래빗 리뷰사항 반영

* test: 중복되는 테스트 제거

* refactor: 사용하지 않는 필드 제거

* refactor: 리뷰 내용 반영

* refactor: ApiPerformanceInterceptor에서 uri 정규화 관련 코드 제거

* refactor: ApiPerformanceInterceptor에서 if-return 문을 if-else 문으로 수정

* refactor: 추가한 interceptor 의 설정에 actuator 경로 무시하도록 셋팅

* refactor: 중복되는 의존성 제거

* refactor: 로깅 시 민감한 쿼리 파라미터 마스킹

- EXCLUDE_QUERIES 에 해당하는 쿼리 파라미터 KEY 값의 VALUE 를 masking 값으로 치환

* refactor: 예외 처리 후에도 Response 로그 찍도록 수정

* refactor: CustomExceptionHandler 원상복구

- Response 로그를 통해 user를 추적할 수 있으므로 로그에 userId 를 추가하지 않습니다

* refactor: 리뷰 사항 반영

* refactor: RequestContext 빌더 제거

* refactor: RequestContextInterceptor import 수정

* refactor: logback yml 파일에서 timestamp 서버 시간과 동일한 규격으로 수정

* refactor: ApiPerformanceInterceptor 에서 동일 내용 로그 중복으로 찍는 문제 수정

* fix: decode를 두 번 하는 문제 수정

* test: 로깅 관련 filter, interceptor 테스트 추가

* refactor: 코드래빗 리뷰사항 반영

* test: contains 로 비교하던 검증 로직을 isEqualTo 로 수정

* test: preHandle 테스트 에서 result 값을 항상 검증

* refactor: 단위테스트에 TestContainer 어노테이션 제거

* fix: conflict 해결

* fix: docker-compose 충돌 해결 (#610)

* chore: release github action 임의 실행 추가

* refactor: 기본 추천 대학 후보 추가 (#161)

* fix: config.alloy 경로 수정

* hotfix: 모의지원 현황 어드민 권한 제거

* hotfix: import 제거

* chore: 서브모듈 해시 업데이트 (#611)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: 사이드 인프라(Redis, Redis-Exporter, Alloy) 분리를 위한 Code Deploy & Docker Compose 수정

2 participants