Skip to content

[REFACTOR] 코드 구조 리팩토링#21

Merged
unifolio0 merged 6 commits intodevelopfrom
refactor/#20
Feb 24, 2026
Merged

[REFACTOR] 코드 구조 리팩토링#21
unifolio0 merged 6 commits intodevelopfrom
refactor/#20

Conversation

@unifolio0
Copy link
Copy Markdown
Contributor

@unifolio0 unifolio0 commented Feb 24, 2026

closed #20

작업 내용

참고 사항

Summary by CodeRabbit

릴리스 노트

  • Chores
    • 프로젝트 구조를 단순화하고 빌드 프로세스를 통합했습니다.
    • CI/CD 파이프라인을 재구성하고 배포 워크플로우를 최적화했습니다.
    • 여러 서비스 모듈을 통합하여 시스템 아키텍처를 개선했습니다.

@unifolio0 unifolio0 self-assigned this Feb 24, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 24, 2026

📝 Walkthrough

Walkthrough

프로젝트 구조를 단순화하기 위해 다중 모듈 구조(api, internal, external, common, domain)를 단일 모듈로 통합합니다. API 관련 워크플로우 파일들을 삭제하고, 테스트 실행 방식을 Docker Compose 기반으로 변경하며, 에러 메시지 관리를 중앙화하고, 로컬 개발 환경 설정을 제거합니다.

Changes

Cohort / File(s) Summary
GitHub Actions 워크플로우 삭제
.github/workflows/cd-api-dev.yml, cd-api-prod.yml, ci-api-test.yml
API 관련 자동화 배포 및 CI 파이프라인 제거 (테스트, Docker 이미지 빌드/푸시, 배포 단계)
GitHub Actions 워크플로우 수정
.github/workflows/cd-internal-dev.yml, cd-internal-prod.yml, ci-internal-test.yml
개별 테스트 스크립트 실행을 Docker Compose 기반 컨테이너 시작 및 wait-for-ready 루프로 변경, Gradle 빌드 단계 통합
API 모듈 파일 삭제
api/build.gradle, api/local-api-docker-compose.yml, api/run-local-api.sh, api/src/docs/asciidoc/index.adoc, api/src/main/java/com/samhap/kokomen/global/...(6개 클래스), api/src/main/resources/application.yml, api/src/test/...(3개 파일)
API 모듈 전체 빌드 설정, 로컬 개발 환경, 문서, 글로벌 설정 클래스(Authentication, WebConfig, ErrorResponse, MemberAuth), 예외 핸들러, 로깅 필터 제거
Domain 및 Common 모듈 파일 삭제
domain/build.gradle, domain/local-docker-compose.yml, domain/run-test-mysql.sh, common/build.gradle, common/run-test-redis.sh
도메인/커먼 모듈의 빌드 설정, 로컬 Docker Compose 설정, 개별 테스트 스크립트 제거
External 모듈 파일 삭제
external/build.gradle, external/src/main/java/com/samhap/kokomen/global/...(4개 클래스), external/src/main/resources/application-external-test.yml
External 모듈의 빌드 설정, ErrorResponse, ExternalErrorMessage, 예외 클래스들 제거
Internal 모듈 파일 삭제
internal/Dockerfile, internal/build.gradle, internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java, internal/src/main/java/.../GlobalExceptionHandler.java, internal/src/test/...(2개 파일)
Internal 모듈 Docker 빌드 설정, 진입점 클래스, 예외 핸들러, 데이터베이스 정리 유틸리티 제거
프로젝트 루트 파일 수정
build.gradle, settings.gradle
build.gradle에서 asciidoctor 플러그인 추가, 프로젝트 수준 의존성 및 태스크 설정 이동; settings.gradle에서 모든 서브프로젝트 include 제거
Docker 및 배포 설정 삭제
docker/dev/docker-compose-dev.yml, docker/dev/promtail/promtail.yaml, docker/prod/docker-compose-prod.yml, docker/prod/nginx/nginx.conf, docker/prod/promtail/promtail.yaml
API 서비스 블록, 로그 수집 설정, nginx 프록시 설정 제거
메인 애플리케이션 클래스 리네이밍
src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java, src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java, src/main/resources/application.yml
KokomenPaymentApiApplication → KokomenPaymentApplication으로 클래스명 변경, 애플리케이션 이름 변경 (kokomen-payment-internal → kokomen-payment), external-test 프로필 제거
글로벌 예외 처리 및 에러 메시지 수정
src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java, src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java
ExternalErrorMessage 대신 PaymentServiceErrorMessage 사용으로 중앙화, HttpMediaTypeNotSupportedException 핸들러 추가, 에러 메시지 상수 2개 추가
로컬 개발 스크립트 수정
run-local-internal.sh
도메인별 테스트 스크립트 실행을 docker compose 기반 컨테이너 시작으로 변경, Gradle 빌드 명령 통합

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Poem

🐰 모듈들을 하나로 모아,
복잡한 구조를 무너뜨려,
Docker로 테스트는 더 우아하게,
에러 메시지도 한곳에서,
깔끔한 프로젝트의 완성! 🎉

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Linked Issues check ❓ Inconclusive 연결된 이슈 #20은 구체적인 요구사항 없이 제목과 빈 TODO 리스트만 포함하고 있어서, 코드 변경사항이 명시적인 요구사항을 충족하는지 확인할 수 없습니다. 이슈 #20에 구체적인 요구사항, 승인 기준, 또는 작업 목록을 추가하여 PR 변경사항이 의도된 목표를 충족하는지 명확히 하시기 바랍니다.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 PR의 주요 변경사항을 정확하게 설명하고 있습니다. 대규모 코드 구조 리팩토링으로 모듈을 평탄화하고 API, 도메인, 공통 모듈을 제거하는 것이 주요 내용입니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 모듈 평탄화 및 불필요한 구성 요소 제거와 관련이 있으므로 범위 내입니다. 구체적인 이슈 요구사항이 없어서 정확한 평가는 어렵지만, 관찰된 변경사항들은 일관된 리팩토링 목표를 따릅니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#20

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.

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @unifolio0, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 Pull Request는 기존의 다중 모듈 Gradle 프로젝트 구조를 단일 모듈 Spring Boot 애플리케이션으로 리팩토링하는 것을 목표로 합니다. api, common, domain, external, internal로 나뉘어 있던 프로젝트를 하나의 kokomen-payment 프로젝트로 통합하여 빌드 및 배포 프로세스를 간소화하고, 코드 관리의 효율성을 높였습니다. 이 변경으로 인해 많은 파일이 이동, 삭제, 또는 수정되었으며, 특히 Docker 및 Nginx 배포 설정이 새로운 단일 애플리케이션 구조에 맞춰 업데이트되었습니다.

Highlights

  • 다중 모듈 프로젝트 단일 모듈로 통합: 기존의 api, common, domain, external, internal 서브 프로젝트들을 단일 루트 프로젝트로 통합하여 프로젝트 구조를 간소화했습니다.
  • 빌드 설정 및 의존성 관리 간소화: 모든 Gradle 서브 프로젝트의 build.gradle 파일이 제거되고, 루트 build.gradle 파일에서 모든 의존성과 빌드 로직을 직접 관리하도록 변경하여 빌드 복잡성을 줄였습니다.
  • 소스 코드 및 리소스 재배치: 기존 서브 프로젝트에 분산되어 있던 모든 소스 코드, 테스트 파일, 리소스 파일들이 단일 루트 프로젝트의 src 디렉토리로 이동되었습니다.
  • Docker 및 배포 구성 업데이트: 단일 모듈 구조에 맞춰 Dockerfile, docker-compose.yml 파일 및 관련 쉘 스크립트가 간소화되고 업데이트되었습니다. 특히, api 서비스 관련 Docker 및 Nginx 설정이 제거되었습니다.
  • 예외 처리 및 로깅 통합: 기존 apiexternal 모듈에 개별적으로 존재하던 예외 처리 (GlobalExceptionHandler) 및 로깅 필터 (LoggingFilter)가 단일 프로젝트 구조에 맞춰 통합 및 재구성되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • api/Dockerfile
    • Dockerfile로 이름이 변경되었습니다.
  • api/build.gradle
    • 제거되었습니다.
  • api/local-api-docker-compose.yml
    • 제거되었습니다.
  • api/run-local-api.sh
    • 제거되었습니다.
  • api/src/docs/asciidoc/index.adoc
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java
    • 제거되었습니다.
  • api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java
    • 제거되었습니다.
  • api/src/main/resources/application.yml
    • 제거되었습니다.
  • api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java
    • 제거되었습니다.
  • api/src/test/java/com/samhap/kokomen/global/BaseTest.java
    • 제거되었습니다.
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java
    • 제거되었습니다.
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java
    • 제거되었습니다.
  • api/src/test/resources/application.yml
    • 제거되었습니다.
  • build.gradle
    • 다중 모듈 설정이 제거되고 모든 의존성이 직접 포함되도록 업데이트되었습니다.
  • common/build.gradle
    • 제거되었습니다.
  • common/run-test-redis.sh
    • 제거되었습니다.
  • docker/dev/docker-compose-dev.yml
    • kokomen-payment-dev-api 서비스 및 관련 로그 볼륨이 제거되었습니다.
  • docker/dev/promtail/promtail.yaml
    • kokomen-payment-api-dev 로그 스크랩 설정이 제거되었습니다.
  • docker/prod/docker-compose-prod.yml
    • kokomen-payment-api 서비스 및 관련 Nginx, Promtail 로그 볼륨이 제거되었습니다.
  • docker/prod/nginx/nginx.conf
    • api_log 형식 정의와 payment-api.kokomen.kr 서버 블록이 제거되었습니다.
  • docker/prod/promtail/promtail.yaml
    • kokomen-payment-api 로그 스크랩 설정이 제거되었습니다.
  • domain/build.gradle
    • 제거되었습니다.
  • domain/local-docker-compose.yml
    • 제거되었습니다.
  • domain/run-test-mysql.sh
    • 제거되었습니다.
  • external/build.gradle
    • 제거되었습니다.
  • external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
    • 제거되었습니다.
  • external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java
    • 제거되었습니다.
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java
    • 제거되었습니다.
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java
    • 제거되었습니다.
  • external/src/main/resources/application-external-test.yml
    • 제거되었습니다.
  • internal/Dockerfile
    • 제거되었습니다.
  • internal/build.gradle
    • 제거되었습니다.
  • internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java
    • 제거되었습니다.
  • internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
    • 제거되었습니다.
  • internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java
    • 제거되었습니다.
  • internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java
    • 제거되었습니다.
  • local-internal-docker-compose.yml
    • internal/local-internal-docker-compose.yml에서 이름이 변경되었습니다.
  • run-local-internal.sh
    • internal/run-local-internal.sh에서 이름이 변경되었고, 테스트 컨테이너 실행 로직이 간소화되었습니다.
  • settings.gradle
    • 서브 프로젝트 포함 설정이 제거되어 단일 프로젝트로 구성되었습니다.
  • src/docs/asciidoc/index.adoc
    • internal/src/docs/asciidoc/index.adoc에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java
    • api/src/main/java/com/samhap/kokomen/KokomenPaymentApiApplication.java에서 이름이 변경되었고 클래스 이름이 수정되었습니다.
  • src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java
    • common/src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java
    • common/src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java
    • external/src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java
    • common/src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/config/RetryConfig.java
    • internal/src/main/java/com/samhap/kokomen/global/config/RetryConfig.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java
    • internal/src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java
    • domain/src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
    • internal/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
    • external/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java에서 이름이 변경되었고, 예외 처리 로직이 통합되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/KokomenException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/KokomenException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java
    • internal/src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java에서 이름이 변경되었고, 누락된 에러 메시지가 추가되었습니다.
  • src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java
    • common/src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java
    • external/src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java
    • internal/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java
    • internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java
    • internal/src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java
    • domain/src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java
    • external/src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java
    • external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java
    • external/src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java
    • external/src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java
    • domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java
    • domain/src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java에서 이름이 변경되었습니다.
  • src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java
    • internal/src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java에서 이름이 변경되었습니다.
  • src/main/resources/application-common.yml
    • common/src/main/resources/application-common.yml에서 이름이 변경되었습니다.
  • src/main/resources/application-domain.yml
    • domain/src/main/resources/application-domain.yml에서 이름이 변경되었습니다.
  • src/main/resources/application-external.yml
    • external/src/main/resources/application-external.yml에서 이름이 변경되었습니다.
  • src/main/resources/application.yml
    • internal/src/main/resources/application.yml에서 이름이 변경되었고, 애플리케이션 이름이 kokomen-payment로 수정되었습니다.
  • src/main/resources/db/migration/V1__create_tosspayments_tables.sql
    • domain/src/main/resources/db/migration/V1__create_tosspayments_tables.sql에서 이름이 변경되었습니다.
  • src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql
    • domain/src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql에서 이름이 변경되었습니다.
  • src/main/resources/db/migration/V3__add_cancel_columns.sql
    • domain/src/main/resources/db/migration/V3__add_cancel_columns.sql에서 이름이 변경되었습니다.
  • src/main/resources/logback-spring.xml
    • common/src/main/resources/logback-spring.xml에서 이름이 변경되었습니다.
  • src/main/resources/templates/payment-fail.html
    • internal/src/main/resources/templates/payment-fail.html에서 이름이 변경되었습니다.
  • src/main/resources/templates/payment-refund.html
    • internal/src/main/resources/templates/payment-refund.html에서 이름이 변경되었습니다.
  • src/main/resources/templates/payment-success.html
    • internal/src/main/resources/templates/payment-success.html에서 이름이 변경되었습니다.
  • src/main/resources/templates/payment-test.html
    • internal/src/main/resources/templates/payment-test.html에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java
    • api/src/test/java/com/samhap/kokomen/KokomenPaymentApiApplicationTests.java에서 이름이 변경되었고 클래스 이름이 수정되었습니다.
  • src/test/java/com/samhap/kokomen/global/BaseControllerTest.java
    • internal/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/global/BaseTest.java
    • internal/src/test/java/com/samhap/kokomen/global/BaseTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java
    • api/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java
    • internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java
    • internal/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java
    • internal/src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java
    • domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java
    • domain/src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java
    • internal/src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java
    • internal/src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java에서 이름이 변경되었습니다.
  • src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java
    • internal/src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java에서 이름이 변경되었습니다.
  • src/test/resources/application-common-test.yml
    • common/src/main/resources/application-common-test.yml에서 이름이 변경되었습니다.
  • src/test/resources/application-domain-test.yml
    • domain/src/main/resources/application-domain-test.yml에서 이름이 변경되었습니다.
  • src/test/resources/application.yml
    • internal/src/test/resources/application.yml에서 이름이 변경되었고, external-test 프로필 포함 설정이 제거되었습니다.
Ignored Files
  • Ignored by pattern: .github/workflows/** (6)
    • .github/workflows/cd-api-dev.yml
    • .github/workflows/cd-api-prod.yml
    • .github/workflows/cd-internal-dev.yml
    • .github/workflows/cd-internal-prod.yml
    • .github/workflows/ci-api-test.yml
    • .github/workflows/ci-internal-test.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link
Copy Markdown

Test Results

34 tests   34 ✅  14s ⏱️
 7 suites   0 💤
 7 files     0 ❌

Results for commit 0cbb342.

@unifolio0 unifolio0 merged commit ae3ba37 into develop Feb 24, 2026
3 of 4 checks passed
@unifolio0 unifolio0 deleted the refactor/#20 branch February 24, 2026 06:52
Copy link
Copy Markdown

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
run-local-internal.sh (1)

8-24: ⚠️ Potential issue | 🟡 Minor

로컬 빌드 전에 DB/Redis 준비 대기를 추가해 플래키를 줄이세요.

현재는 컨테이너를 띄운 직후 ./gradlew clean build가 실행되어 테스트가 간헐적으로 실패할 수 있습니다.

✅ 준비 대기 추가 예시
 # 테스트 컨테이너 실행 (MySQL + Redis)
 docker compose -f test-docker-compose.yml up -d
+
+echo "Waiting for MySQL..."
+for i in $(seq 1 30); do
+  if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
+    echo "MySQL is ready"
+    break
+  fi
+  echo "Waiting for MySQL... ($i/30)"
+  sleep 2
+done
+
+echo "Waiting for Redis..."
+for i in $(seq 1 30); do
+  if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
+    echo "Redis is ready"
+    break
+  fi
+  echo "Waiting for Redis... ($i/30)"
+  sleep 2
+done
 
 ./gradlew clean build
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@run-local-internal.sh` around lines 8 - 24, The script starts containers
(docker compose -f test-docker-compose.yml up -d) then immediately runs
./gradlew clean build, causing flaky failures; add an explicit readiness wait
after starting the test containers to poll MySQL and Redis until they respond
(e.g., loop using docker compose exec or docker run --network "$NETWORK_NAME" to
run mysqladmin ping / redis-cli PING), with a configurable timeout and clear
error on timeout, before proceeding to ./gradlew clean build and the subsequent
docker compose -f local-internal-docker-compose.yml up --build -d; reference the
NETWORK_NAME variable and the start commands (docker compose -f
test-docker-compose.yml up -d and ./gradlew clean build) when implementing the
wait.
🧹 Nitpick comments (1)
src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java (1)

10-10: 415 응답도 표준 메시지로 통일하는 편이 좋습니다.
현재 e.getMessage()는 영어/내부 메시지 노출로 UX가 흔들릴 수 있습니다.

♻️ 제안 변경
         return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
-                .body(new ErrorResponse(e.getMessage()));
+                .body(new ErrorResponse(PaymentServiceErrorMessage.INVALID_REQUEST_FORMAT.getMessage()));

Also applies to: 62-68

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java`
at line 10, The handler is returning e.getMessage() for 415 responses (and
similarly in the other handlers around lines 62-68), which can leak
internal/English messages; update GlobalExceptionHandler so
HttpMediaTypeNotSupportedException and the other exception handlers return a
standardized, user-facing message (e.g., "지원되지 않는 미디어 타입" or a message from
MessageSource/locale files) instead of e.getMessage(); modify the method that
handles HttpMediaTypeNotSupportedException (and any handlers referencing
e.getMessage()) to construct and return a uniform ApiError/ResponseEntity with a
fixed status message or localized key rather than the raw exception message.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/cd-internal-dev.yml:
- Around line 21-47: The readiness loops for MySQL ("Wait for MySQL to be
ready") and Redis ("Wait for Redis to be ready") currently break when ready but
always continue on timeout; modify each loop to detect timeout and explicitly
fail the step (e.g., after the for loop check a success flag or test the last
ping, and if not ready run echo "MySQL/Redis failed to start" and exit 1) so
that payment-test-mysql (mysqladmin ping -h localhost) and payment-test-redis
(redis-cli ping | grep -q PONG) timeouts cause the job to stop instead of
proceeding to the "Test & Build" step.

In @.github/workflows/cd-internal-prod.yml:
- Around line 21-47: The readiness loops for the "Wait for MySQL to be ready"
and "Wait for Redis to be ready" steps currently break on success but silently
continue on timeout; modify each loop so that if the loop completes without
detecting readiness it prints a clear error and exits non‑zero (e.g., echo
"MySQL not ready after timeout" && exit 1 and similarly for Redis) so the
subsequent "Test & Build" step fails instead of proceeding when services never
became ready.

In @.github/workflows/ci-internal-test.yml:
- Around line 25-48: The wait steps ("Wait for MySQL to be ready" and "Wait for
Redis to be ready") currently continue the pipeline after timing out and
reference hardcoded container names (payment-test-mysql, payment-test-redis);
change each loop so that after N retries it exits with a non-zero status (so the
job fails) instead of breaking silently, and replace the hardcoded container
names by resolving the container ID via docker compose -f
test-docker-compose.yml ps -q <service-name> (use the MySQL and Redis service
names defined in test-docker-compose.yml) so the checks target the correct
containers; also consider enabling fail-fast shell options (e.g., set -euo
pipefail) at the start of those run blocks to ensure failures propagate.

In `@build.gradle`:
- Around line 1-53: Your build.gradle pins Flyway 11.9.1 which is incompatible
with Spring Boot 3.4.5 and will cause startup errors; fix by either downgrading
the Flyway artifacts ('org.flywaydb:flyway-core' and
'org.flywaydb:flyway-mysql') to the Spring Boot 3.4.5-managed version (10.20.1)
or bumping the Spring Boot plugin version ('id "org.springframework.boot"') to a
3.5.x+ or 4.x release that supports Flyway 11.x; additionally update the
Asciidoctor Gradle plugin ('id "org.asciidoctor.jvm.convert"') from 3.3.2 to
4.0.5. Ensure you change only the version strings in the plugins block and the
Flyway dependency coordinates in the dependencies block so Gradle resolves
compatible BOM-managed versions.

In `@src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java`:
- Around line 10-11: 테스트 메서드 contextLoads()를 한글 메서드명으로 변경하세요 (예: 컨텍스트가_로딩된다 또는
컨텍스트_로드됨) in class KokomenPaymentApplicationTests so it follows the rule "Use
Korean method names for test methods without DisplayName"; alternatively, if you
want to keep the English name, add a `@DisplayName`("...") annotation with a
Korean description above the contextLoads() method; keep the `@Test` annotation
as-is and ensure the method signature and visibility remain unchanged.

---

Outside diff comments:
In `@run-local-internal.sh`:
- Around line 8-24: The script starts containers (docker compose -f
test-docker-compose.yml up -d) then immediately runs ./gradlew clean build,
causing flaky failures; add an explicit readiness wait after starting the test
containers to poll MySQL and Redis until they respond (e.g., loop using docker
compose exec or docker run --network "$NETWORK_NAME" to run mysqladmin ping /
redis-cli PING), with a configurable timeout and clear error on timeout, before
proceeding to ./gradlew clean build and the subsequent docker compose -f
local-internal-docker-compose.yml up --build -d; reference the NETWORK_NAME
variable and the start commands (docker compose -f test-docker-compose.yml up -d
and ./gradlew clean build) when implementing the wait.

---

Nitpick comments:
In
`@src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java`:
- Line 10: The handler is returning e.getMessage() for 415 responses (and
similarly in the other handlers around lines 62-68), which can leak
internal/English messages; update GlobalExceptionHandler so
HttpMediaTypeNotSupportedException and the other exception handlers return a
standardized, user-facing message (e.g., "지원되지 않는 미디어 타입" or a message from
MessageSource/locale files) instead of e.getMessage(); modify the method that
handles HttpMediaTypeNotSupportedException (and any handlers referencing
e.getMessage()) to construct and return a uniform ApiError/ResponseEntity with a
fixed status message or localized key rather than the raw exception message.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3c9bcfb and 0cbb342.

📒 Files selected for processing (134)
  • .github/workflows/cd-api-dev.yml
  • .github/workflows/cd-api-prod.yml
  • .github/workflows/cd-internal-dev.yml
  • .github/workflows/cd-internal-prod.yml
  • .github/workflows/ci-api-test.yml
  • .github/workflows/ci-internal-test.yml
  • Dockerfile
  • api/build.gradle
  • api/local-api-docker-compose.yml
  • api/run-local-api.sh
  • api/src/docs/asciidoc/index.adoc
  • api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java
  • api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java
  • api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
  • api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java
  • api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java
  • api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
  • api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java
  • api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java
  • api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java
  • api/src/main/resources/application.yml
  • api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java
  • api/src/test/java/com/samhap/kokomen/global/BaseTest.java
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java
  • api/src/test/resources/application.yml
  • build.gradle
  • common/build.gradle
  • common/run-test-redis.sh
  • docker/dev/docker-compose-dev.yml
  • docker/dev/promtail/promtail.yaml
  • docker/prod/docker-compose-prod.yml
  • docker/prod/nginx/nginx.conf
  • docker/prod/promtail/promtail.yaml
  • domain/build.gradle
  • domain/local-docker-compose.yml
  • domain/run-test-mysql.sh
  • external/build.gradle
  • external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
  • external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java
  • external/src/main/resources/application-external-test.yml
  • internal/Dockerfile
  • internal/build.gradle
  • internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java
  • internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
  • internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java
  • internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java
  • local-internal-docker-compose.yml
  • run-local-internal.sh
  • settings.gradle
  • src/docs/asciidoc/index.adoc
  • src/main/java/com/samhap/kokomen/KokomenPaymentApplication.java
  • src/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.java
  • src/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.java
  • src/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.java
  • src/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.java
  • src/main/java/com/samhap/kokomen/global/config/RetryConfig.java
  • src/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.java
  • src/main/java/com/samhap/kokomen/global/domain/BaseEntity.java
  • src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
  • src/main/java/com/samhap/kokomen/global/exception/BadRequestException.java
  • src/main/java/com/samhap/kokomen/global/exception/ForbiddenException.java
  • src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
  • src/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.java
  • src/main/java/com/samhap/kokomen/global/exception/KokomenException.java
  • src/main/java/com/samhap/kokomen/global/exception/NotFoundException.java
  • src/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.java
  • src/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.java
  • src/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.java
  • src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java
  • src/main/java/com/samhap/kokomen/payment/controller/PaymentController.java
  • src/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.java
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.java
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentState.java
  • src/main/java/com/samhap/kokomen/payment/domain/PaymentType.java
  • src/main/java/com/samhap/kokomen/payment/domain/ServiceType.java
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.java
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.java
  • src/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.java
  • src/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.java
  • src/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.java
  • src/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/Checkout.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/Failure.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/Receipt.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.java
  • src/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.java
  • src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.java
  • src/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.java
  • src/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.java
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.java
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.java
  • src/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/Checkout.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/Failure.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/Receipt.java
  • src/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.java
  • src/main/resources/application-common.yml
  • src/main/resources/application-domain.yml
  • src/main/resources/application-external.yml
  • src/main/resources/application.yml
  • src/main/resources/db/migration/V1__create_tosspayments_tables.sql
  • src/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sql
  • src/main/resources/db/migration/V3__add_cancel_columns.sql
  • src/main/resources/logback-spring.xml
  • src/main/resources/templates/payment-fail.html
  • src/main/resources/templates/payment-refund.html
  • src/main/resources/templates/payment-success.html
  • src/main/resources/templates/payment-test.html
  • src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java
  • src/test/java/com/samhap/kokomen/global/BaseControllerTest.java
  • src/test/java/com/samhap/kokomen/global/BaseTest.java
  • src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java
  • src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java
  • src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java
  • src/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.java
  • src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.java
  • src/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.java
  • src/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.java
  • src/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.java
  • src/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.java
  • src/test/resources/application-common-test.yml
  • src/test/resources/application-domain-test.yml
  • src/test/resources/application.yml
💤 Files with no reviewable changes (46)
  • docker/prod/promtail/promtail.yaml
  • settings.gradle
  • domain/run-test-mysql.sh
  • internal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
  • api/run-local-api.sh
  • api/src/test/resources/application.yml
  • api/src/main/resources/application.yml
  • internal/build.gradle
  • docker/prod/docker-compose-prod.yml
  • external/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
  • src/test/resources/application.yml
  • .github/workflows/cd-api-dev.yml
  • api/src/test/java/com/samhap/kokomen/global/BaseTest.java
  • docker/prod/nginx/nginx.conf
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.java
  • docker/dev/docker-compose-dev.yml
  • common/run-test-redis.sh
  • .github/workflows/ci-api-test.yml
  • api/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.java
  • api/src/docs/asciidoc/index.adoc
  • api/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.java
  • external/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.java
  • docker/dev/promtail/promtail.yaml
  • api/src/main/java/com/samhap/kokomen/global/annotation/Authentication.java
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.java
  • api/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.java
  • api/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.java
  • internal/Dockerfile
  • api/src/main/java/com/samhap/kokomen/global/config/WebConfig.java
  • api/src/test/java/com/samhap/kokomen/global/BaseControllerTest.java
  • api/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.java
  • api/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.java
  • internal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.java
  • external/src/main/resources/application-external-test.yml
  • domain/local-docker-compose.yml
  • api/local-api-docker-compose.yml
  • .github/workflows/cd-api-prod.yml
  • api/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.java
  • external/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.java
  • domain/build.gradle
  • internal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.java
  • common/build.gradle
  • internal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.java
  • external/build.gradle
  • api/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.java
  • api/build.gradle

Comment on lines +21 to +47
- name: Start test containers
run: docker compose -f test-docker-compose.yml up -d

- name: Grant execute permission for run-test-redis.sh
run: chmod +x run-test-redis.sh
working-directory: ./common

- name: Run test mysql script
run: ./run-test-mysql.sh
working-directory: ./domain

- name: Run test redis script
run: ./run-test-redis.sh
working-directory: ./common

- name: Test & Build internal only
run: ./gradlew :internal:build
- name: Wait for MySQL to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
echo "MySQL is ready"
break
fi
echo "Waiting for MySQL... ($i/30)"
sleep 2
done

- name: Wait for Redis to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
echo "Redis is ready"
break
fi
echo "Waiting for Redis... ($i/30)"
sleep 2
done

- name: Test & Build
run: ./gradlew build
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

레디니스 타임아웃 후에도 성공으로 진행됨

현재 루프는 준비되지 않아도 종료 후 다음 단계로 진행합니다. 서비스가 기동되지 않은 상태에서 테스트/빌드 및 이미지 푸시가 수행될 수 있어 CI 신뢰성이 떨어집니다. 타임아웃 시 명시적으로 실패 처리하세요.

🛠️ 타임아웃 시 실패 처리 추가
       - name: Wait for MySQL to be ready
         run: |
-          for i in $(seq 1 30); do
+          ready=0
+          for i in $(seq 1 30); do
             if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
               echo "MySQL is ready"
+              ready=1
               break
             fi
             echo "Waiting for MySQL... ($i/30)"
             sleep 2
           done
+          if [ "$ready" -ne 1 ]; then
+            echo "MySQL did not become ready in time"
+            exit 1
+          fi

       - name: Wait for Redis to be ready
         run: |
-          for i in $(seq 1 30); do
+          ready=0
+          for i in $(seq 1 30); do
             if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
               echo "Redis is ready"
+              ready=1
               break
             fi
             echo "Waiting for Redis... ($i/30)"
             sleep 2
           done
+          if [ "$ready" -ne 1 ]; then
+            echo "Redis did not become ready in time"
+            exit 1
+          fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/cd-internal-dev.yml around lines 21 - 47, The readiness
loops for MySQL ("Wait for MySQL to be ready") and Redis ("Wait for Redis to be
ready") currently break when ready but always continue on timeout; modify each
loop to detect timeout and explicitly fail the step (e.g., after the for loop
check a success flag or test the last ping, and if not ready run echo
"MySQL/Redis failed to start" and exit 1) so that payment-test-mysql (mysqladmin
ping -h localhost) and payment-test-redis (redis-cli ping | grep -q PONG)
timeouts cause the job to stop instead of proceeding to the "Test & Build" step.

Comment on lines +21 to +47
- name: Start test containers
run: docker compose -f test-docker-compose.yml up -d

- name: Grant execute permission for run-test-redis.sh
run: chmod +x run-test-redis.sh
working-directory: ./common

- name: Run test mysql script
run: ./run-test-mysql.sh
working-directory: ./domain

- name: Run test redis script
run: ./run-test-redis.sh
working-directory: ./common

- name: Test & Build internal only
run: ./gradlew :internal:build
- name: Wait for MySQL to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
echo "MySQL is ready"
break
fi
echo "Waiting for MySQL... ($i/30)"
sleep 2
done

- name: Wait for Redis to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
echo "Redis is ready"
break
fi
echo "Waiting for Redis... ($i/30)"
sleep 2
done

- name: Test & Build
run: ./gradlew build
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

레디니스 타임아웃 후에도 성공으로 진행됨

현재 루프는 준비되지 않아도 종료 후 다음 단계로 진행합니다. 서비스가 기동되지 않은 상태에서 테스트/빌드 및 이미지 푸시가 수행될 수 있어 CI 신뢰성이 떨어집니다. 타임아웃 시 명시적으로 실패 처리하세요.

🛠️ 타임아웃 시 실패 처리 추가
       - name: Wait for MySQL to be ready
         run: |
-          for i in $(seq 1 30); do
+          ready=0
+          for i in $(seq 1 30); do
             if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
               echo "MySQL is ready"
+              ready=1
               break
             fi
             echo "Waiting for MySQL... ($i/30)"
             sleep 2
           done
+          if [ "$ready" -ne 1 ]; then
+            echo "MySQL did not become ready in time"
+            exit 1
+          fi

       - name: Wait for Redis to be ready
         run: |
-          for i in $(seq 1 30); do
+          ready=0
+          for i in $(seq 1 30); do
             if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
               echo "Redis is ready"
+              ready=1
               break
             fi
             echo "Waiting for Redis... ($i/30)"
             sleep 2
           done
+          if [ "$ready" -ne 1 ]; then
+            echo "Redis did not become ready in time"
+            exit 1
+          fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/cd-internal-prod.yml around lines 21 - 47, The readiness
loops for the "Wait for MySQL to be ready" and "Wait for Redis to be ready"
steps currently break on success but silently continue on timeout; modify each
loop so that if the loop completes without detecting readiness it prints a clear
error and exits non‑zero (e.g., echo "MySQL not ready after timeout" && exit 1
and similarly for Redis) so the subsequent "Test & Build" step fails instead of
proceeding when services never became ready.

Comment on lines +25 to +48
- name: Start test containers
run: docker compose -f test-docker-compose.yml up -d

- name: Grant execute permission for run-test-redis.sh
run: chmod +x run-test-redis.sh
working-directory: ./common
- name: Wait for MySQL to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
echo "MySQL is ready"
break
fi
echo "Waiting for MySQL... ($i/30)"
sleep 2
done

- name: Run test mysql script
run: ./run-test-mysql.sh
working-directory: ./domain
- name: Wait for Redis to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
echo "Redis is ready"
break
fi
echo "Waiting for Redis... ($i/30)"
sleep 2
done
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "test-docker-compose.yml" -o -name "*docker-compose*.yml" | head -20

Repository: samhap-soft/kokomen-payment

Length of output: 206


🏁 Script executed:

cat -n ./test-docker-compose.yml

Repository: samhap-soft/kokomen-payment

Length of output: 1258


서비스 준비 실패 시 파이프라인이 계속 진행되는 문제를 막아주세요.

현재 루프는 타임아웃 후에도 실패 처리 없이 다음 단계로 넘어갑니다. 준비 실패를 명확히 실패로 처리해 플래키/은폐된 실패를 줄이는 것이 안전합니다. 또한 payment-test-mysql, payment-test-redis 컨테이너명이 test-docker-compose.yml에 고정되어 있습니다.

✅ 타임아웃 시 실패하도록 보강 예시
       - name: Wait for MySQL to be ready
         run: |
+          ready=false
           for i in $(seq 1 30); do
             if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
               echo "MySQL is ready"
+              ready=true
               break
             fi
             echo "Waiting for MySQL... ($i/30)"
             sleep 2
           done
+          if [ "$ready" != "true" ]; then
+            echo "MySQL did not become ready in time"
+            exit 1
+          fi
@@
       - name: Wait for Redis to be ready
         run: |
+          ready=false
           for i in $(seq 1 30); do
             if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
               echo "Redis is ready"
+              ready=true
               break
             fi
             echo "Waiting for Redis... ($i/30)"
             sleep 2
           done
+          if [ "$ready" != "true" ]; then
+            echo "Redis did not become ready in time"
+            exit 1
+          fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Start test containers
run: docker compose -f test-docker-compose.yml up -d
- name: Grant execute permission for run-test-redis.sh
run: chmod +x run-test-redis.sh
working-directory: ./common
- name: Wait for MySQL to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
echo "MySQL is ready"
break
fi
echo "Waiting for MySQL... ($i/30)"
sleep 2
done
- name: Run test mysql script
run: ./run-test-mysql.sh
working-directory: ./domain
- name: Wait for Redis to be ready
run: |
for i in $(seq 1 30); do
if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
echo "Redis is ready"
break
fi
echo "Waiting for Redis... ($i/30)"
sleep 2
done
- name: Start test containers
run: docker compose -f test-docker-compose.yml up -d
- name: Wait for MySQL to be ready
run: |
ready=false
for i in $(seq 1 30); do
if docker exec payment-test-mysql mysqladmin ping -h localhost --silent 2>/dev/null; then
echo "MySQL is ready"
ready=true
break
fi
echo "Waiting for MySQL... ($i/30)"
sleep 2
done
if [ "$ready" != "true" ]; then
echo "MySQL did not become ready in time"
exit 1
fi
- name: Wait for Redis to be ready
run: |
ready=false
for i in $(seq 1 30); do
if docker exec payment-test-redis redis-cli ping 2>/dev/null | grep -q PONG; then
echo "Redis is ready"
ready=true
break
fi
echo "Waiting for Redis... ($i/30)"
sleep 2
done
if [ "$ready" != "true" ]; then
echo "Redis did not become ready in time"
exit 1
fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci-internal-test.yml around lines 25 - 48, The wait steps
("Wait for MySQL to be ready" and "Wait for Redis to be ready") currently
continue the pipeline after timing out and reference hardcoded container names
(payment-test-mysql, payment-test-redis); change each loop so that after N
retries it exits with a non-zero status (so the job fails) instead of breaking
silently, and replace the hardcoded container names by resolving the container
ID via docker compose -f test-docker-compose.yml ps -q <service-name> (use the
MySQL and Redis service names defined in test-docker-compose.yml) so the checks
target the correct containers; also consider enabling fail-fast shell options
(e.g., set -euo pipefail) at the start of those run blocks to ensure failures
propagate.

Comment on lines 1 to +53
plugins {
id 'java'
id 'java-library'
id 'org.springframework.boot' version '3.4.5'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.asciidoctor.jvm.convert' version '3.3.2'
}

subprojects {
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.samhap'
version = '0.0.1-SNAPSHOT'

group = 'com.samhap'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

repositories {
mavenCentral()
}
repositories {
mavenCentral()
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

ext {
set('snippetsDir', file("build/generated-snippets"))
}

dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.retry:spring-retry'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.flywaydb:flyway-core:11.9.1'
implementation 'org.flywaydb:flyway-mysql:11.9.1'

implementation 'io.micrometer:micrometer-registry-prometheus'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

Spring Boot 3.4.5 BOM managed dependencies Flyway Asciidoctor

💡 Result:

For Spring Boot 3.4.5 (org.springframework.boot:spring-boot-dependencies:3.4.5) BOM-managed versions:

  • Flyway

    • org.flywaydb:flyway-core 10.20.1 (and the other org.flywaydb modules are also managed at 10.20.1) [1]
  • Asciidoctor

    • The Boot 3.4.5 BOM does not appear to manage org.asciidoctor:* directly, but it does manage Spring REST Docs BOM:
      • org.springframework.restdocs:spring-restdocs-bom 3.0.3 [2]
    • From that, org.springframework.restdocs:spring-restdocs-asciidoctor is managed at 3.0.5 [3]

Sources: [1] [2] [3]


🌐 Web query:

Spring Boot 3.4.5 release notes managed versions Flyway

💡 Result:

For Spring Boot 3.4.5 (released April 24, 2025), the announcement post does not list individual managed dependency version changes; it points you to the general release details instead. [2]

In the Spring Boot 3.4 release notes, the notable third‑party dependency upgrades for the 3.4 line include Flyway 10.20 (i.e., Boot 3.4.x manages Flyway 10.20 unless overridden in your build). [1]

Sources
[1] Spring Boot 3.4 Release Notes (Dependency Upgrades / Flyway 10.20) https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
[2] Spring Boot 3.4.5 available now (release announcement) https://spring.io/blog/2025/04/24/spring-boot-3-4-5-available-now


🌐 Web query:

io.spring.dependency-management 1.1.7 Spring Boot 3.4.5 compatibility

💡 Result:

Yes—io.spring.dependency-management 1.1.7 is compatible with Spring Boot 3.4.5, as long as your Gradle version meets Spring Boot 3.4’s minimum.

  • Spring Boot 3.4 requires Gradle 7.6.4+ or 8.4+ (older 7.5/8.0–8.3 are not supported). [1]
  • io.spring.dependency-management 1.1.7 supports Gradle 6.8+ (6/7/8) and Java 8+, so it works fine on the Gradle versions that Boot 3.4.5 requires. [2]
  • If you’re using the org.springframework.boot Gradle plugin, you typically don’t need to pin a dependency-management plugin version yourself; Boot brings it in transitively, and it reacts when the plugin is applied. [3]

Sources:
[1] Spring Boot 3.4 Release Notes – Minimum Requirements (Gradle) https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
[2] Dependency Management Plugin 1.1.7 Reference – Requirements https://docs.spring.io/dependency-management-plugin/docs/1.1.7/reference/html
[3] Spring blog – Boot Gradle plugin + dependency-management plugin relationship https://spring.io/blog/2017/04/05/spring-boot-s-new-gradle-plugin


🌐 Web query:

Flyway 11.9.1 Spring Boot 3.4 compatibility

💡 Result:

Spring Boot 3.4.x does not officially support Flyway 11. Spring Boot 3.4’s dependency management pins Flyway to the 10.20.1 line (not 11.x). [1]

In practice, upgrading a Spring Boot 3.4 app to Flyway 11.x (including 11.9.1) can break at startup because Flyway 11 removed the cleanOnValidationError option, while Spring Boot 3.4’s Flyway auto-configuration still references it (reported against Spring Boot 3.4.1 + Flyway 11.0.0). [2][3]

What to do

  • Recommended: stay on the Spring Boot 3.4-managed Flyway (10.20.1). [1]
  • If you need Flyway 11.x (e.g., 11.9.1): upgrade to Spring Boot 3.5+, which updates its managed Flyway version to 11.7.x. [4][5]

Sources: Spring Boot 3.4 managed dependency coordinates (Flyway 10.20.1) [1]; Spring Boot issue about Flyway 11 breaking due to cleanOnValidationError removal [2]; Flyway docs noting deprecation/removal plan for cleanOnValidationError [3]; Spring Boot 3.5 release notes and dependency coordinates showing Flyway 11.7.x [4][5].


🌐 Web query:

Flyway 11.9.1 supported versions Spring Boot

💡 Result:

Flyway 11.9.1 (released 2025‑06‑05) is not the Flyway version managed by any Spring Boot BOM I can find in the official “Managed Dependency Coordinates”. (documentation.red-gate.com)

What Spring Boot manages around that timeframe:

  • Spring Boot 3.5.x manages Flyway 11.7.2 (example: 3.5.9 docs show flyway-core 11.7.2). (docs.spring.io)
  • Spring Boot 4.0.x manages Flyway 11.14.1 (4.0 docs show Flyway artifacts at 11.14.1). (docs.spring.io)

So, if you want to run Flyway 11.9.1 with Spring Boot, the practical “supported” choices are:

  • Use Spring Boot 3.5.x or 4.0.x and override Flyway to 11.9.1 (same major version 11, so generally compatible with Boot’s Flyway integration).
  • Avoid Spring Boot 3.4.1 + Flyway 11 unless you’ve confirmed you have the related fix(es); 3.4.1 is known to fail with Flyway 11 due to the removed cleanOnValidationError setting. (github.com)

(For context: Spring Boot 3.3 upgraded to Flyway 10.) (github.com)

Citations:


🌐 Web query:

Asciidoctor Gradle plugin 3.3.2 Spring Boot 3.4 compatibility

💡 Result:

Asciidoctor Gradle plugin 3.3.2 should be usable with Spring Boot 3.4 in the sense that Spring Boot 3.4’s build requirements (Gradle 7.6.4+ or 8.4+) are newer than what the Asciidoctor plugin line requires (the “classic” Asciidoctor Gradle plugins require at least Gradle 4.9 and JDK 11) [1][2]. Spring Boot 3.4 also runs on Java 17+, so the JDK baseline is not a problem either [1].

However, 3.3.2 is very old (Feb 21, 2021) and won’t be what’s currently tested against modern Gradle/Spring Boot setups; the current org.asciidoctor.jvm.convert release is 4.0.5 (Aug 25, 2025), so upgrading is the safer choice for Spring Boot 3.4 projects [3][4].

Sources: [1] [2] [3] [4]


Flyway 버전 호환성 문제가 발견되었습니다. Spring Boot 3.4.5는 Flyway 11을 지원하지 않습니다.

Spring Boot 3.4.5 BOM은 Flyway 10.20.1을 관리하지만, 현재 설정에서는 Flyway 11.9.1을 명시적으로 지정했습니다. Spring Boot 3.4.x에서는 Flyway 11.x의 cleanOnValidationError 제거로 인해 애플리케이션 시작 시 오류가 발생합니다. 다음 중 하나를 선택하세요:

  • Flyway 버전을 10.20.1로 다운그레이드 (Spring Boot 3.4.5 권장)
  • Spring Boot를 3.5.x 이상으로 업그레이드 (Flyway 11.7.2 관리) 또는 4.0.x로 업그레이드 (Flyway 11.14.1 관리)

추가로 Asciidoctor Gradle 플러그인은 3.3.2에서 4.0.5로 업그레이드하는 것이 좋습니다. (현재 버전은 2021년 2월 릴리스로 매우 오래됨)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@build.gradle` around lines 1 - 53, Your build.gradle pins Flyway 11.9.1 which
is incompatible with Spring Boot 3.4.5 and will cause startup errors; fix by
either downgrading the Flyway artifacts ('org.flywaydb:flyway-core' and
'org.flywaydb:flyway-mysql') to the Spring Boot 3.4.5-managed version (10.20.1)
or bumping the Spring Boot plugin version ('id "org.springframework.boot"') to a
3.5.x+ or 4.x release that supports Flyway 11.x; additionally update the
Asciidoctor Gradle plugin ('id "org.asciidoctor.jvm.convert"') from 3.3.2 to
4.0.5. Ensure you change only the version strings in the plugins block and the
Flyway dependency coordinates in the dependencies block so Gradle resolves
compatible BOM-managed versions.

Comment on lines 10 to 11
@Test
void contextLoads() {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

테스트 메서드명을 한글로 맞춰주세요.

🔧 제안 변경
-    void contextLoads() {
+    void 컨텍스트_로딩된다() {
     }
Based on learnings: Applies to **/*Test.java : Use Korean method names for test methods without `DisplayName` annotations.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.java` around
lines 10 - 11, 테스트 메서드 contextLoads()를 한글 메서드명으로 변경하세요 (예: 컨텍스트가_로딩된다 또는
컨텍스트_로드됨) in class KokomenPaymentApplicationTests so it follows the rule "Use
Korean method names for test methods without DisplayName"; alternatively, if you
want to keep the English name, add a `@DisplayName`("...") annotation with a
Korean description above the contextLoads() method; keep the `@Test` annotation
as-is and ensure the method signature and visibility remain unchanged.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 PR은 멀티 모듈 구조를 단일 모듈로 리팩토링하는 큰 규모의 변경이네요. 프로젝트 구조가 단순화되어 유지보수성이 향상될 것으로 기대됩니다. 전반적으로 변경 사항들은 일관성 있게 잘 적용되었습니다. api 모듈이 제거되고 관련 설정들이 정리된 것을 확인했습니다. 한 가지, 로컬 개발 환경 실행 스크립트에서 개선할 점이 있어 코멘트를 남깁니다.

chmod +x run-test-mysql.sh
./run-test-mysql.sh
# 테스트 컨테이너 실행 (MySQL + Redis)
docker compose -f test-docker-compose.yml up -d
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

기존 스크립트에서는 run-test-mysql.shrun-test-redis.sh를 통해 데이터베이스와 레디스 컨테이너가 'healthy' 상태가 될 때까지 기다리는 로직이 있었습니다. 현재 스크립트에서는 이 대기 로직이 누락되어, 의존 서비스가 준비되지 않은 상태에서 애플리케이션이 시작되어 오류가 발생할 수 있습니다.

docker compose up 명령어에 --wait 옵션을 추가하면 의존 컨테이너의 health check가 성공할 때까지 기다리게 할 수 있습니다. 이를 통해 스크립트의 안정성을 높일 수 있습니다.

Suggested change
docker compose -f test-docker-compose.yml up -d
docker compose -f test-docker-compose.yml up -d --wait

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR] 코드 구조 리팩토링

1 participant