Conversation
📝 WalkthroughWalkthrough프로젝트 구조를 단순화하기 위해 다중 모듈 구조(api, internal, external, common, domain)를 단일 모듈로 통합합니다. API 관련 워크플로우 파일들을 삭제하고, 테스트 실행 방식을 Docker Compose 기반으로 변경하며, 에러 메시지 관리를 중앙화하고, 로컬 개발 환경 설정을 제거합니다. Changes
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @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 애플리케이션으로 리팩토링하는 것을 목표로 합니다. Highlights
🧠 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
Ignored Files
Using Gemini Code AssistThe 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
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 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
|
Test Results34 tests 34 ✅ 14s ⏱️ Results for commit 0cbb342. |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
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
📒 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.ymlDockerfileapi/build.gradleapi/local-api-docker-compose.ymlapi/run-local-api.shapi/src/docs/asciidoc/index.adocapi/src/main/java/com/samhap/kokomen/global/annotation/Authentication.javaapi/src/main/java/com/samhap/kokomen/global/config/WebConfig.javaapi/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.javaapi/src/main/java/com/samhap/kokomen/global/dto/MemberAuth.javaapi/src/main/java/com/samhap/kokomen/global/exception/ApiErrorMessage.javaapi/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.javaapi/src/main/java/com/samhap/kokomen/global/infrastructure/MemberAuthArgumentResolver.javaapi/src/main/java/com/samhap/kokomen/global/logging/LoggingFilter.javaapi/src/main/java/com/samhap/kokomen/payment/dto/MyPaymentResponse.javaapi/src/main/resources/application.ymlapi/src/test/java/com/samhap/kokomen/global/BaseControllerTest.javaapi/src/test/java/com/samhap/kokomen/global/BaseTest.javaapi/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.javaapi/src/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.javaapi/src/test/resources/application.ymlbuild.gradlecommon/build.gradlecommon/run-test-redis.shdocker/dev/docker-compose-dev.ymldocker/dev/promtail/promtail.yamldocker/prod/docker-compose-prod.ymldocker/prod/nginx/nginx.confdocker/prod/promtail/promtail.yamldomain/build.gradledomain/local-docker-compose.ymldomain/run-test-mysql.shexternal/build.gradleexternal/src/main/java/com/samhap/kokomen/global/dto/ErrorResponse.javaexternal/src/main/java/com/samhap/kokomen/global/exception/ExternalErrorMessage.javaexternal/src/main/java/com/samhap/kokomen/global/exception/HttpBadRequestErrorException.javaexternal/src/main/java/com/samhap/kokomen/global/exception/HttpInternalServerErrorException.javaexternal/src/main/resources/application-external-test.ymlinternal/Dockerfileinternal/build.gradleinternal/src/main/java/com/samhap/kokomen/KokomenPaymentInternalApplication.javainternal/src/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.javainternal/src/test/java/com/samhap/kokomen/KokomenPaymentInternalApplicationTests.javainternal/src/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.javalocal-internal-docker-compose.ymlrun-local-internal.shsettings.gradlesrc/docs/asciidoc/index.adocsrc/main/java/com/samhap/kokomen/KokomenPaymentApplication.javasrc/main/java/com/samhap/kokomen/global/annotation/ExecutionTimer.javasrc/main/java/com/samhap/kokomen/global/aop/ExecutionTimerAspect.javasrc/main/java/com/samhap/kokomen/global/aop/TosspaymentsLoggingAspect.javasrc/main/java/com/samhap/kokomen/global/config/RedisSingleNodeConfig.javasrc/main/java/com/samhap/kokomen/global/config/RetryConfig.javasrc/main/java/com/samhap/kokomen/global/config/TosspaymentsConfirmRetryPolicy.javasrc/main/java/com/samhap/kokomen/global/domain/BaseEntity.javasrc/main/java/com/samhap/kokomen/global/dto/ErrorResponse.javasrc/main/java/com/samhap/kokomen/global/exception/BadRequestException.javasrc/main/java/com/samhap/kokomen/global/exception/ForbiddenException.javasrc/main/java/com/samhap/kokomen/global/exception/GlobalExceptionHandler.javasrc/main/java/com/samhap/kokomen/global/exception/InternalServerErrorException.javasrc/main/java/com/samhap/kokomen/global/exception/KokomenException.javasrc/main/java/com/samhap/kokomen/global/exception/NotFoundException.javasrc/main/java/com/samhap/kokomen/global/exception/PaymentServiceErrorMessage.javasrc/main/java/com/samhap/kokomen/global/exception/UnauthorizedException.javasrc/main/java/com/samhap/kokomen/global/infrastructure/ObjectToStringDeserializer.javasrc/main/java/com/samhap/kokomen/global/logging/LoggingFilter.javasrc/main/java/com/samhap/kokomen/payment/controller/PaymentController.javasrc/main/java/com/samhap/kokomen/payment/controller/PaymentTestController.javasrc/main/java/com/samhap/kokomen/payment/domain/PaymentErrorMessage.javasrc/main/java/com/samhap/kokomen/payment/domain/PaymentState.javasrc/main/java/com/samhap/kokomen/payment/domain/PaymentType.javasrc/main/java/com/samhap/kokomen/payment/domain/ServiceType.javasrc/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPayment.javasrc/main/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResult.javasrc/main/java/com/samhap/kokomen/payment/domain/TosspaymentsStatus.javasrc/main/java/com/samhap/kokomen/payment/external/TossPaymentsClientBuilder.javasrc/main/java/com/samhap/kokomen/payment/external/TosspaymentsClient.javasrc/main/java/com/samhap/kokomen/payment/external/TosspaymentsInternalServerErrorCode.javasrc/main/java/com/samhap/kokomen/payment/external/dto/Checkout.javasrc/main/java/com/samhap/kokomen/payment/external/dto/EasyPay.javasrc/main/java/com/samhap/kokomen/payment/external/dto/Failure.javasrc/main/java/com/samhap/kokomen/payment/external/dto/Receipt.javasrc/main/java/com/samhap/kokomen/payment/external/dto/TossDateTimeDeserializer.javasrc/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsCancel.javasrc/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsConfirmRequest.javasrc/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentCancelRequest.javasrc/main/java/com/samhap/kokomen/payment/external/dto/TosspaymentsPaymentResponse.javasrc/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepository.javasrc/main/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentResultRepository.javasrc/main/java/com/samhap/kokomen/payment/service/PaymentFacadeService.javasrc/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentResultService.javasrc/main/java/com/samhap/kokomen/payment/service/TosspaymentsPaymentService.javasrc/main/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionService.javasrc/main/java/com/samhap/kokomen/payment/service/dto/CancelRequest.javasrc/main/java/com/samhap/kokomen/payment/service/dto/Checkout.javasrc/main/java/com/samhap/kokomen/payment/service/dto/ConfirmRequest.javasrc/main/java/com/samhap/kokomen/payment/service/dto/EasyPay.javasrc/main/java/com/samhap/kokomen/payment/service/dto/Failure.javasrc/main/java/com/samhap/kokomen/payment/service/dto/PaymentResponse.javasrc/main/java/com/samhap/kokomen/payment/service/dto/Receipt.javasrc/main/java/com/samhap/kokomen/payment/service/dto/TosspaymentsCancel.javasrc/main/resources/application-common.ymlsrc/main/resources/application-domain.ymlsrc/main/resources/application-external.ymlsrc/main/resources/application.ymlsrc/main/resources/db/migration/V1__create_tosspayments_tables.sqlsrc/main/resources/db/migration/V2__add_service_type_and_failure_message_column.sqlsrc/main/resources/db/migration/V3__add_cancel_columns.sqlsrc/main/resources/logback-spring.xmlsrc/main/resources/templates/payment-fail.htmlsrc/main/resources/templates/payment-refund.htmlsrc/main/resources/templates/payment-success.htmlsrc/main/resources/templates/payment-test.htmlsrc/test/java/com/samhap/kokomen/KokomenPaymentApplicationTests.javasrc/test/java/com/samhap/kokomen/global/BaseControllerTest.javasrc/test/java/com/samhap/kokomen/global/BaseTest.javasrc/test/java/com/samhap/kokomen/global/MySQLDatabaseCleaner.javasrc/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentFixtureBuilder.javasrc/test/java/com/samhap/kokomen/global/fixture/TosspaymentsPaymentResultFixtureBuilder.javasrc/test/java/com/samhap/kokomen/payment/controller/PaymentControllerTest.javasrc/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentResultTest.javasrc/test/java/com/samhap/kokomen/payment/domain/TosspaymentsPaymentTest.javasrc/test/java/com/samhap/kokomen/payment/repository/TosspaymentsPaymentRepositoryTest.javasrc/test/java/com/samhap/kokomen/payment/service/PaymentFacadeServiceTest.javasrc/test/java/com/samhap/kokomen/payment/service/TosspaymentsTransactionServiceTest.javasrc/test/resources/application-common-test.ymlsrc/test/resources/application-domain-test.ymlsrc/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
| - 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 |
There was a problem hiding this comment.
레디니스 타임아웃 후에도 성공으로 진행됨
현재 루프는 준비되지 않아도 종료 후 다음 단계로 진행합니다. 서비스가 기동되지 않은 상태에서 테스트/빌드 및 이미지 푸시가 수행될 수 있어 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.
| - 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 |
There was a problem hiding this comment.
레디니스 타임아웃 후에도 성공으로 진행됨
현재 루프는 준비되지 않아도 종료 후 다음 단계로 진행합니다. 서비스가 기동되지 않은 상태에서 테스트/빌드 및 이미지 푸시가 수행될 수 있어 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.
| - 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 |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -name "test-docker-compose.yml" -o -name "*docker-compose*.yml" | head -20Repository: samhap-soft/kokomen-payment
Length of output: 206
🏁 Script executed:
cat -n ./test-docker-compose.ymlRepository: 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.
| - 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.
| 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' | ||
| } |
There was a problem hiding this comment.
🧩 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-core10.20.1 (and the otherorg.flywaydbmodules 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-bom3.0.3 [2]
- From that,
org.springframework.restdocs:spring-restdocs-asciidoctoris managed at 3.0.5 [3]
- The Boot 3.4.5 BOM does not appear to manage
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-management1.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.bootGradle 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
cleanOnValidationErrorsetting. (github.com)
(For context: Spring Boot 3.3 upgraded to Flyway 10.) (github.com)
Citations:
- 1: https://documentation.red-gate.com/flyway/release-notes-and-older-versions/release-notes-for-flyway-engine?utm_source=openai
- 2: https://docs.spring.io/spring-boot/3.5.9/appendix/dependency-versions/coordinates.html?utm_source=openai
- 3: https://docs.spring.io/spring-boot/4.0/appendix/dependency-versions/coordinates.html?utm_source=openai
- 4: Spring Boot 3.4.1 fails with Flyway v11 due to 'cleanOnValidationError' removal spring-projects/spring-boot#43770
- 5: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.3-Release-Notes?utm_source=openai
🌐 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.
| @Test | ||
| void contextLoads() { |
There was a problem hiding this comment.
테스트 메서드명을 한글로 맞춰주세요.
🔧 제안 변경
- void contextLoads() {
+ void 컨텍스트_로딩된다() {
}🤖 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.
| chmod +x run-test-mysql.sh | ||
| ./run-test-mysql.sh | ||
| # 테스트 컨테이너 실행 (MySQL + Redis) | ||
| docker compose -f test-docker-compose.yml up -d |
There was a problem hiding this comment.
기존 스크립트에서는 run-test-mysql.sh와 run-test-redis.sh를 통해 데이터베이스와 레디스 컨테이너가 'healthy' 상태가 될 때까지 기다리는 로직이 있었습니다. 현재 스크립트에서는 이 대기 로직이 누락되어, 의존 서비스가 준비되지 않은 상태에서 애플리케이션이 시작되어 오류가 발생할 수 있습니다.
docker compose up 명령어에 --wait 옵션을 추가하면 의존 컨테이너의 health check가 성공할 때까지 기다리게 할 수 있습니다. 이를 통해 스크립트의 안정성을 높일 수 있습니다.
| docker compose -f test-docker-compose.yml up -d | |
| docker compose -f test-docker-compose.yml up -d --wait |
closed #20
작업 내용
참고 사항
Summary by CodeRabbit
릴리스 노트