Conversation
- payment-gateway에 환불 엔드포인트 및 Toss/Stub 프로바이더 환불 기능 추가 - RefundService 트랜잭션 분리 (RefundTransactionService 신규) - RefundEntity/RefundMapper를 domain에서 infra 레이어로 이동 - RefundRepository 포트 및 어댑터 구현 - RefundController REST API 추가 - PaymentGateway 출력 포트에 환불 메서드 추가 - 테스트 패키지 구조 정리 및 신규 테스트 추가
PG 응답 지연 시 worker 스레드 무한 대기로 인한 계단식 장애를 방지하기 위해 타임아웃, 서킷 브레이커, 벌크헤드를 적용한다. - RestClient에 SimpleClientHttpRequestFactory 적용 (connectTimeout=2s, readTimeout=3s) - @CIRCUITBREAKER로 연속 실패 시 빠른 실패 처리 - @bulkhead로 동시 요청 수 제한 - fallback 메서드로 PG_TEMPORARY_UNAVAILABLE, PG_NETWORK_ERROR 도메인 실패 반환 - 복원력 패턴 검증을 위한 SpringBootTest 통합 테스트 추가 - test용 .yml 파일 추가 및 통합테스트 프로필 변경
- RestClient에 connectTimeout(3s), readTimeout(5s) 설정 - Resilience4j @CIRCUITBREAKER(paymentGateway) 적용 (confirm/cancel) - CB fallback에서 OPEN/일반 실패 구분하여 예외 분리 - 예외 클래스를 application 레이어에 배치 (DDD 의존 방향 준수) - GlobalExceptionHandler에 503/502 응답 매핑 추가 - MockWebServer 단위 테스트 및 CB 통합 테스트 추가
QueryDSL 기반 키워드 검색, 다중 정렬, 페이지네이션을 지원하며 향후 ELK 스택 도입 시 Adapter 교체만으로 전환 가능하도록 설계
PG 승인 후 티켓 발급을 동기 호출하고, 실패 시 PG 취소 후 FAILED 처리. 티켓 발급 Outbox 인프라(서비스, 리포지토리, 엔티티, 스케줄러, 어드민 컨트롤러) 삭제.
- reusable-build.yml: Force docker-java API version - build.gradle testcontainer version up - reusable-build.yml: docker 진단 추가 - reusable-build.yml: runs-on 우분투 버전 지정 latest > 22.04 - reusable-build.yml: TESTCONTAINERS_RYUK_DISABLED: true
Summary of ChangesHello @git-mesome, 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! 이 PR은 결제 시스템에 환불 기능을 도입하고, 기존 결제 승인 로직을 개선하여 티켓 발급과의 연동을 강화하며 시스템의 복원력을 향상시키는 것을 목표로 합니다. 또한, 사용자 경험 향상을 위해 키워드 및 정렬 옵션을 지원하는 공연 검색 기능을 추가하여 사용자가 원하는 공연을 쉽게 찾을 수 있도록 했습니다. Highlights
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
|
There was a problem hiding this comment.
Pull request overview
This PR introduces a payment refund API flow (including PG cancel support and refund persistence) and also adds a performance search API backed by a new QueryDSL adapter, along with CI/Testcontainers workarounds and related test refactors.
Changes:
- Add performance search endpoint + QueryDSL search adapter + DTOs and comprehensive tests in
schedule-reservation-ticketing. - Implement refund API in
payment(refund transaction/service/controller, refund persistence, PG cancel integration, and related domain/service tests). - Extend
payment-gatewaywith cancel support and resilience patterns; adjust CI workflow for Docker/Testcontainers stability.
Reviewed changes
Copilot reviewed 90 out of 90 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/service/performance/PerformanceServiceSearchTest.java | Unit tests for PerformanceService search orchestration. |
| schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/repository/performance/QueryDslPerformanceSearchAdapterTest.java | DataJpaTest coverage for QueryDSL-based performance search (filters/sort/paging). |
| schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchConditionTest.java | Tests for keyword normalization and sort defaults in search condition. |
| schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/controller/performance/PerformanceSearchControllerTest.java | MVC tests for the new performances search API endpoint. |
| schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/builder/PerformanceStatisticBuilder.java | Adds builder support for averageStar used by new search/sort tests. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/service/performance/PerformanceService.java | Adds searchPerformances() service method using PerformanceSearchPort. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/repository/performance/QueryDslPerformanceSearchAdapter.java | New QueryDSL adapter implementing performance search queries (keyword/sort/pagination). |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/repository/performance/PerformanceSearchPort.java | New port interface for performance search. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/response/PerformanceSearchResponse.java | New response record for search results + pagination. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchSort.java | New enum for search sort modes. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchCondition.java | New condition record with keyword normalization and sort defaulting. |
| schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/controller/performance/PerformanceController.java | Adds /api/v1/performances/search endpoint. |
| payment/src/test/resources/schema-test.sql | Updates integration-test schema: adds refunds/schedules and adjusts reservations for refund logic. |
| payment/src/test/java/wisoft/nextframe/payment/repository/PaymentRepositoryImplTest.java | Removes repository unit test (refactor/relocation). |
| payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundRepositoryImplTest.java | Adds unit tests for RefundRepositoryImpl. |
| payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundMapperTest.java | Fixes imports/package usage for refund mapper test. |
| payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundEntityFixture.java | Fixes fixture import to infra RefundEntity. |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/schedule/TicketIssueSchedulerTest.java | Removes scheduler unit test (scheduler removed). |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/persistence/RefundMapperTest.java | Removes old refund mapper test in obsolete package. |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/persistence/PaymentMapperTest.java | Updates mapper test to new PaymentMapper dependencies (refund lookup). |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxRepositoryImplTest.java | Removes outbox repository test (outbox removed). |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/StubPaymentGatewayAdapterTest.java | Package/name alignment for StubPaymentGatewayAdapter test. |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapterTest.java | Adds unit tests for HTTP PG adapter confirm/cancel parsing and failures. |
| payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapterCircuitBreakerTest.java | Adds circuit breaker behavior tests for payment gateway adapter. |
| payment/src/test/java/wisoft/nextframe/payment/domain/refund/RefundTest.java | Moves test to correct package + adds state transition coverage. |
| payment/src/test/java/wisoft/nextframe/payment/domain/refund/RefundPolicyStatusTest.java | Moves test to correct package and cleans up imports. |
| payment/src/test/java/wisoft/nextframe/payment/domain/payment/PaymentTest.java | Updates expectations around domain events and failure path changes. |
| payment/src/test/java/wisoft/nextframe/payment/domain/payment/PaymentIssuerTest.java | Adds tests for PaymentIssuer issuing refunds. |
| payment/src/test/java/wisoft/nextframe/payment/domain/fixture/RefundEntityFixture.java | Removes obsolete fixture in old domain package. |
| payment/src/test/java/wisoft/nextframe/payment/application/refund/RefundTransactionServiceTest.java | Adds unit tests for refund prepare/complete transaction orchestration. |
| payment/src/test/java/wisoft/nextframe/payment/application/payment/PaymentServiceIntegrationTest.java | Updates integration test to new “ticket issue fail → PG cancel → payment FAILED” behavior. |
| payment/src/test/java/wisoft/nextframe/payment/application/payment/PaymentEventHandlerTest.java | Updates handler test to reflect PaymentFailedEvent → reservation cancel outbox flow. |
| payment/src/test/java/wisoft/nextframe/payment/application/RefundServiceTest.java | Removes duplicate/obsolete refund service test. |
| payment/src/main/java/wisoft/nextframe/payment/presentation/ticketissue/TicketIssueRetryAdminController.java | Removes manual admin endpoint for ticket issue retry. |
| payment/src/main/java/wisoft/nextframe/payment/presentation/refund/dto/RefundRequest.java | Adds refund request DTO (reason). |
| payment/src/main/java/wisoft/nextframe/payment/presentation/refund/dto/RefundApprovedData.java | Adds refund response DTO for approved refund details. |
| payment/src/main/java/wisoft/nextframe/payment/presentation/refund/RefundController.java | Adds refund endpoint /api/v1/payments/{paymentId}/refund. |
| payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundRepositoryImpl.java | Implements RefundRepository using JPA + mapper. |
| payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundMapper.java | Moves mapper to infra package and registers as Spring component. |
| payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundEntity.java | Moves RefundEntity to infra package (table mapping for refunds). |
| payment/src/main/java/wisoft/nextframe/payment/infra/refund/JpaRefundRepository.java | Adds JPA repository to lookup refunds by paymentId. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/schedule/TicketIssueScheduler.java | Removes scheduled retry for ticket-issue outbox. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxRepositoryImpl.java | Removes ticket issue outbox repository implementation. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxEntity.java | Removes ticket issue outbox entity. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/JpaTicketIssueOutboxRepository.java | Removes JPA repository for ticket issue outbox. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adaptor/HttpPaymentGatewayAdaptor.java | Removes legacy “Adaptor” implementation (replaced by Adapter). |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/dto/TicketIssueResponse.java | Moves ticket issue DTO to adapter dto package. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/dto/TicketIssueRequest.java | Moves ticket issue DTO to adapter dto package. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/TicketingAdaptor.java | Updates package/imports for Ticketing adapter and exceptions. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/StubPaymentGatewayAdapter.java | Renames/extends stub gateway adapter to include cancel behavior. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapter.java | New HTTP PG adapter with timeout + circuit breaker + cancel support. |
| payment/src/main/java/wisoft/nextframe/payment/infra/payment/PaymentMapper.java | Enhances mapping: loads current refund when reconstructing Payment domain. |
| payment/src/main/java/wisoft/nextframe/payment/infra/DbReservationReader.java | Adds query to read performance datetime via reservations→schedules join. |
| payment/src/main/java/wisoft/nextframe/payment/global/PaymentGlobalExceptionHandler.java | Adds exception handlers for PG circuit breaker/unavailable scenarios. |
| payment/src/main/java/wisoft/nextframe/payment/domain/payment/event/PaymentApprovedEvent.java | Removes PaymentApprovedEvent. |
| payment/src/main/java/wisoft/nextframe/payment/domain/payment/PaymentIssuer.java | Registers PaymentIssuer as Spring component. |
| payment/src/main/java/wisoft/nextframe/payment/domain/payment/Payment.java | Stops emitting PaymentApprovedEvent on approve(). |
| payment/src/main/java/wisoft/nextframe/payment/application/refund/port/output/RefundRepository.java | Adds refund output port. |
| payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundTransactionService.java | Adds transactional orchestration for prepare/complete refund. |
| payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundService.java | Implements refund flow: prepare → PG cancel → complete persist. |
| payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundCancelFailedException.java | Adds exception for PG cancel failure. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/TicketingClient.java | Updates imports after TicketIssueResult package move. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/TicketIssueResult.java | Moves TicketIssueResult into port/output package. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/ReservationReader.java | Adds getPerformanceDateTime() for refund policy calculation. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/PaymentGateway.java | Adds cancelPayment() and cancel result record. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueRetryUseCase.java | Removes ticket issue retry use case. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxTarget.java | Removes ticket issue outbox target. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxService.java | Removes ticket issue outbox service. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxRepository.java | Removes ticket issue outbox repository port. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/handler/PaymentEventHandler.java | Removes approved-event handling; keeps failed-event → reservation cancel outbox. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueTemporarilyUnavailableException.java | Moves exception package to application/payment/exception. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueInvalidResponseException.java | Moves exception package to application/payment/exception. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueExternalCallFailedException.java | Moves exception package to application/payment/exception. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/PaymentGatewayTemporarilyUnavailableException.java | Adds exception for CB-open payment gateway operations. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/PaymentGatewayExternalCallFailedException.java | Adds exception for external PG call failure. |
| payment/src/main/java/wisoft/nextframe/payment/application/payment/PaymentService.java | Changes confirm flow: synchronous ticket issue, best-effort PG cancel on failure, then persist result. |
| payment/build.gradle | Updates Testcontainers dependencies to use BOM. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProviderTest.java | Adds unit tests for Toss provider confirm/cancel behavior. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProviderResilienceTest.java | Adds resilience/circuit breaker integration tests for provider. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProviderTest.java | Adds unit tests for stub provider confirm/cancel. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/ProviderRouterTest.java | Adds router unit tests for confirm/cancel routing and unsupported providers. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/api/PaymentGatewayControllerTest.java | Adds MVC tests for confirm/cancel endpoints. |
| payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/PaymentGatewayApplicationTests.java | Adjusts context load test profile. |
| payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.java | Adds timeouts + circuit breaker/bulkhead + cancel support + paymentKey tracking. |
| payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProvider.java | Adds cancel support for stub provider. |
| payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/ProviderRouter.java | Refactors router to support both confirm and cancel. |
| payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/PaymentProvider.java | Extends provider interface with cancel(). |
| payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/api/PaymentGatewayController.java | Adds /payments/cancel endpoint and request/response records. |
| payment-gateway/build.gradle | Adds AOP + resilience4j dependencies and mockwebserver for tests. |
| .github/workflows/reusable-build.yml | Pins runner version and adds Docker/Testcontainers diagnostic + workaround steps. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Code Review
이번 PR은 결제 환불 API 구현, Toss Payments 연동 및 Resilience4j를 이용한 복원력 패턴 적용 등 중요한 기능 추가와 개선이 많이 이루어졌습니다. 특히 외부 연동에 대한 안정성을 높이려는 노력이 돋보입니다. 그러나 몇 가지 아키텍처 및 구현 관련하여 심각한 우려 사항이 발견되었습니다. paymentKey를 인메모리 맵에 저장하는 방식은 데이터 유실 위험이 매우 크며, 티켓 발급 로직에서 아웃박스 패턴을 제거하고 동기식 보상 트랜잭션으로 변경한 것은 시스템의 안정성을 크게 저하시킬 수 있습니다. 이러한 부분들은 프로덕션 환경에서 심각한 문제로 이어질 수 있으므로 반드시 재검토가 필요합니다. 그 외에도 코드의 안정성과 유지보수성을 높이기 위한 몇 가지 제안 사항을 포함했습니다.
[payment]
- 티켓 발급을 동기 플로우에서 Outbox 패턴으로 재전환
- PaymentApprovedEvent 복원 (Payment.approve() 시 발행)
- TicketIssueOutbox 인프라 복원 (Service, RetryUseCase, Entity, Repository, Scheduler)
- PaymentEventHandler: onPaymentApproved() 복원
- PaymentService: TicketingClient 직접 의존 제거 및 단순화
- PG 호출 전 예약 유효성 검증 추가
- ReservationReader.isPayable() 추가 (status=CREATED AND expires_at > NOW())
- PaymentService에서 PG 호출 전 만료·취소 예약 차단
- ReservationExpiredException 추가 → 409 CONFLICT 응답
- 환불 시 SRT 예약 취소·좌석 해제 연동
- RefundService: 환불 완료 후 ReservationCancelOutboxService.cancelOrEnqueue() 호출
- schema-test.sql: ticket_issue_outbox, reservations(status, expires_at) 추가
[schedule-reservation-ticketing]
- DELETE /api/v1/reservations/{reservationId} 엔드포인트 추가
- CREATED: 결제 실패 취소, CONFIRMED: 환불 취소, CANCELLED: 멱등 처리
- 취소 시 SeatState.isLocked=false 좌석 해제 포함
- Reservation.cancelForRefund() 추가 (CONFIRMED → CANCELLED)
- ReservationRepository.findByIdWithSeats() 추가
- SecurityConfig: DELETE /api/v1/reservations/** 인증 제외 (서버 간 내부 호출)
- ReservationTimeoutScheduler: fixedRate 60s → 10s (만료 감지 지연 단축)
- RefundController의 try-catch 블록 제거, 예외 처리를 PaymentGlobalExceptionHandler에 위임 - RefundCancelFailedException 전역 핸들러 추가 (502 BAD_GATEWAY) - RefundEntity.paymentId(UUID) → payment(@OnetoOne PaymentEntity)로 JPA 관계 리팩토링 - PaymentEntity에 @OnetoOne(mappedBy="payment") RefundEntity 역방향 관계 추가 - PaymentMapper에서 JpaRefundRepository 의존성 제거, JPA lazy loading으로 환불 조회 - RefundMapper.toEntity 시그니처 변경 (UUID → PaymentEntity) - RefundRepositoryImpl에 JpaPaymentRepository 추가, getReferenceById로 프록시 참조 - JpaRefundRepository 메서드명 수정: findByPaymentId → findByPayment_Id (JPA 네이밍 컨벤션) - 관련 테스트 업데이트 (PaymentMapperTest, RefundEntityFixture, RefundMapperTest, RefundRepositoryImplTest)
- 기존: SELECT performance_id 목록 전체를 로드한 뒤 Java에서 size() 계산 → 결과가 많을수록 불필요한 네트워크/메모리 비용 발생 - 변경: SELECT COUNT(DISTINCT performance.id) 단일 집계 쿼리로 교체 → DB에서 직접 카운트, 스칼라 값 1개만 반환 - groupBy 제거 (countDistinct가 대체) - fetchOne() 결과 null 방어 처리 추가
- PaymentController의 try-catch 블록 제거, 비즈니스 로직에만 집중 - mapToUserMessage() 헬퍼를 PaymentGlobalExceptionHandler.mapTossErrorToMessage()로 이동 - PaymentConfirmedFailedException 전역 핸들러 추가 (Toss 에러코드 → 사용자 메시지 변환) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Payment 도메인에 paymentKey 필드 추가, approve(String paymentKey)로 승인 시 저장 - PaymentEntity에 payment_key 컬럼 추가 및 PaymentMapper 매핑 반영 - PaymentGateway 포트의 cancelPayment에 paymentKey 파라미터 추가 - RefundService에서 취소 요청 시 payment.getPaymentKey()를 PG에 전달 - payment-gateway의 CancelRequest에 paymentKey 필드 추가 - TossPaymentProvider의 ConcurrentHashMap(paymentKeyStore) 완전 제거 - schema-test.sql의 payments 테이블에 payment_key 컬럼 추가 - 영향받는 모든 테스트 갱신
🛠️ 설명 (Description)
결제 환불(취소) 기능을 구현하고, 결제 승인 API의 안정성을 강화하기 위해 복원력 패턴(Resilience4j)을 적용했습니다. 또한, CI 환경에서 Testcontainers 사용 시 발생하는 Docker 관련 문제를 해결했습니다.
📄 설계 문서 (Design Document)
N/A
✅ 테스트 계획 (Test Plan)
PaymentGatewayControllerTest: 새로 추가된/payments/cancelAPI 엔드포인트와 기존/payments/confirm엔드포인트의 HTTP 요청/응답 처리를 MockMvc를 이용해 테스트했습니다.ProviderRouterTest:confirm및cancel요청이 올바른 결제 제공자에게 라우팅되는지, 지원하지 않는 제공자 요청 시 예외를 발생하는지 확인했습니다.StubPaymentProviderTest: StubPaymentProvider의supports,confirm,cancel메서드 동작을 확인했습니다.TossPaymentProviderTest: MockWebServer를 사용하여 TossPaymentProvider의confirm및cancelAPI 호출 성공/실패 시나리오를 테스트했습니다.TossPaymentProviderResilienceTest: Resilience4j (Circuit Breaker, Bulkhead) 패턴이 TossPaymentProvider의confirm메서드에 올바르게 적용되었는지, 네트워크 지연 및 실패 상황에서 fallback이 정상 동작하는지 MockWebServer를 통해 검증했습니다.📝 변경 사항 요약 (Summary)
/api/v1/gateway/payments/cancelREST API 엔드포인트 추가 (POST).payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/PaymentProvider.java인터페이스에cancel메서드 추가.payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProvider.java및payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.java에서cancel메서드 구현.payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.java의confirm메서드에 Resilience4j (Circuit Breaker, Bulkhead) 적용 및RestClient에 연결/읽기 타임아웃 설정.payment-gateway/build.gradle에spring-boot-starter-aop,io.github.resilience4j:resilience4j-spring-boot3:2.2.0,com.squareup.okhttp3:mockwebserver:4.11.0의존성 추가..github/workflows/reusable-build.yml)에서 빌드 환경을ubuntu-latest에서ubuntu-22.04로 변경.sudo chmod 666 /var/run/docker.sock,TESTCONTAINERS_RYUK_DISABLED: true,api.version=1.44강제 설정).🔗 관련 이슈 (Related Issues)
☑️ 체크리스트 (Checklist)
👀 리뷰어를 위한 참고 사항 (Notes for Reviewers)
TossPaymentProvider에 적용된 Resilience4j (Circuit Breaker, Bulkhead) 설정 및 fallback 로직을 중점적으로 검토해주시면 감사하겠습니다. 관련 테스트는payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProviderResilienceTest.java를 참고해주세요./payments/cancel엔드포인트의 요청/응답 DTO 및 라우팅 로직이 결제 도메인 요구사항을 잘 반영하고 있는지 확인 부탁드립니다..github/workflows/reusable-build.yml)에 추가된 Docker 진단 및 워크어라운드 설정(특히TESTCONTAINERS_RYUK_DISABLED: true와docker-javaAPI 버전 강제 변경)이 적절한지 검토 바랍니다. 이는 CI 환경에서 Testcontainers 실행 시 발생한 이슈를 해결하기 위한 임시 방편입니다.➕ 추가 정보 (Additional Information)
ubuntu-latest에서ubuntu-22.04로 업그레이드했습니다.docker-javaAPI 버전을 명시적으로 지정했습니다. 또한,TESTCONTAINERS_RYUK_DISABLED환경 변수를true로 설정하여 Testcontainers의 리소스 정리 컨테이너(Ryuk)로 인한 잠재적 문제를 방지했습니다.