Skip to content

#164 feat payment refund api#174

Merged
git-mesome merged 11 commits intodevelopfrom
#164-feat-payment-refund-api
Feb 24, 2026
Merged

#164 feat payment refund api#174
git-mesome merged 11 commits intodevelopfrom
#164-feat-payment-refund-api

Conversation

@git-mesome
Copy link
Copy Markdown
Contributor

@git-mesome git-mesome commented Feb 18, 2026

🛠️ 설명 (Description)

결제 환불(취소) 기능을 구현하고, 결제 승인 API의 안정성을 강화하기 위해 복원력 패턴(Resilience4j)을 적용했습니다. 또한, CI 환경에서 Testcontainers 사용 시 발생하는 Docker 관련 문제를 해결했습니다.

📄 설계 문서 (Design Document)

N/A

✅ 테스트 계획 (Test Plan)

  • 유닛 테스트:
    • PaymentGatewayControllerTest: 새로 추가된 /payments/cancel API 엔드포인트와 기존 /payments/confirm 엔드포인트의 HTTP 요청/응답 처리를 MockMvc를 이용해 테스트했습니다.
    • ProviderRouterTest: confirmcancel 요청이 올바른 결제 제공자에게 라우팅되는지, 지원하지 않는 제공자 요청 시 예외를 발생하는지 확인했습니다.
    • StubPaymentProviderTest: StubPaymentProvider의 supports, confirm, cancel 메서드 동작을 확인했습니다.
    • TossPaymentProviderTest: MockWebServer를 사용하여 TossPaymentProvider의 confirmcancel API 호출 성공/실패 시나리오를 테스트했습니다.
  • 통합 테스트:
    • TossPaymentProviderResilienceTest: Resilience4j (Circuit Breaker, Bulkhead) 패턴이 TossPaymentProvider의 confirm 메서드에 올바르게 적용되었는지, 네트워크 지연 및 실패 상황에서 fallback이 정상 동작하는지 MockWebServer를 통해 검증했습니다.
  • 테스트 커버리지: 새로 추가된 결제 취소 API 및 관련 로직에 대한 단위 및 통합 테스트를 작성하여 주요 시나리오를 검증했습니다. 특히, 결제망 연동 로직의 안정성을 높이기 위해 복원력 패턴에 대한 테스트를 강화했습니다.

📝 변경 사항 요약 (Summary)

  • 결제 환불(취소) 기능을 위한 /api/v1/gateway/payments/cancel REST API 엔드포인트 추가 (POST).
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/PaymentProvider.java 인터페이스에 cancel 메서드 추가.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProvider.javapayment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.java 에서 cancel 메서드 구현.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.javaconfirm 메서드에 Resilience4j (Circuit Breaker, Bulkhead) 적용 및 RestClient에 연결/읽기 타임아웃 설정.
  • payment-gateway/build.gradlespring-boot-starter-aop, io.github.resilience4j:resilience4j-spring-boot3:2.2.0, com.squareup.okhttp3:mockwebserver:4.11.0 의존성 추가.
  • GitHub Actions CI Workflow (.github/workflows/reusable-build.yml)에서 빌드 환경을 ubuntu-latest에서 ubuntu-22.04로 변경.
  • CI 환경에서 Testcontainers 사용 시 발생하는 Docker 권한 문제 해결을 위한 진단 스크립트 및 워크어라운드 로직 추가 (sudo chmod 666 /var/run/docker.sock, TESTCONTAINERS_RYUK_DISABLED: true, api.version=1.44 강제 설정).
  • 신규 환불 API 및 복원력 패턴에 대한 MockMvc, MockWebServer 기반의 통합 테스트 및 단위 테스트 코드 작성.

🔗 관련 이슈 (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 및 라우팅 로직이 결제 도메인 요구사항을 잘 반영하고 있는지 확인 부탁드립니다.
  • CI Workflow (.github/workflows/reusable-build.yml)에 추가된 Docker 진단 및 워크어라운드 설정(특히 TESTCONTAINERS_RYUK_DISABLED: truedocker-java API 버전 강제 변경)이 적절한지 검토 바랍니다. 이는 CI 환경에서 Testcontainers 실행 시 발생한 이슈를 해결하기 위한 임시 방편입니다.

➕ 추가 정보 (Additional Information)

  • CI 빌드 환경을 ubuntu-latest에서 ubuntu-22.04로 업그레이드했습니다.
  • Testcontainers 라이브러리 사용 시 발생하는 Docker 권한 및 호환성 문제를 해결하기 위해 Docker 소켓 권한을 완화하고, docker-java API 버전을 명시적으로 지정했습니다. 또한, TESTCONTAINERS_RYUK_DISABLED 환경 변수를 true로 설정하여 Testcontainers의 리소스 정리 컨테이너(Ryuk)로 인한 잠재적 문제를 방지했습니다.

- 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
Copilot AI review requested due to automatic review settings February 18, 2026 07:55
@git-mesome git-mesome self-assigned this Feb 18, 2026
@git-mesome git-mesome requested a review from Jinpyo-An February 18, 2026 07:56
@git-mesome git-mesome added status: review 코드 리뷰 중 type: chore 빌드 관련 수정, 패키지 매니저 설정 등 type: feature 새로운 기능 요청 또는 구현 type: improvement 기존 기능 개선 type: test 테스트 코드 추가/수정 labels Feb 18, 2026
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @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

  • 결제 환불 API 추가: 결제 게이트웨이에 환불 엔드포인트 및 관련 데이터 구조를 추가하고, 결제 모듈에 환불 서비스와 트랜잭션 로직을 구현했습니다.
  • 결제 승인 로직 개선 및 복원력 강화: 결제 승인 후 티켓 발급을 동기식으로 처리하도록 변경하고, 티켓 발급 실패 시 PG 결제를 베스트 에포트 방식으로 취소하도록 로직을 추가했습니다. 또한, TossPaymentProvider에 Circuit Breaker 및 Bulkhead 패턴을 적용하여 외부 PG 호출의 안정성을 높였습니다.
  • 티켓 발급 아웃박스 패턴 제거: 기존의 비동기 티켓 발급을 위한 아웃박스 패턴(TicketIssueOutbox) 및 관련 인프라 코드를 제거하고 동기식 처리로 전환했습니다.
  • 공연 검색 API 도입: 키워드 검색 및 다양한 정렬 옵션(최신순, 조회수순, 별점순, 날짜순)을 지원하는 새로운 공연 검색 API를 추가하여 사용자 편의성을 높였습니다.
  • 테스트 코드 강화: 추가된 환불 기능, 복원력 패턴, 공연 검색 기능에 대한 단위 및 통합 테스트 코드를 대폭 추가하여 시스템의 안정성을 확보했습니다.
Changelog
  • payment-gateway/build.gradle
    • Spring AOP 및 Resilience4j 의존성이 추가되었습니다.
    • 테스트용 MockWebServer 의존성이 추가되었습니다.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/api/PaymentGatewayController.java
    • 결제 취소 요청을 처리하는 /payments/cancel POST 엔드포인트가 추가되었습니다.
    • 결제 취소 요청 및 응답을 위한 CancelRequestCancelResponse 레코드가 정의되었습니다.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/PaymentProvider.java
    • cancel 메서드가 인터페이스에 추가되었습니다.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/ProviderRouter.java
    • cancel 메서드가 추가되어 적절한 결제 제공자로 취소 요청을 라우팅합니다.
    • findProvider 로직이 private 헬퍼 메서드로 추출되었습니다.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProvider.java
    • cancel 메서드가 구현되어 스텁 응답을 반환합니다.
  • payment-gateway/src/main/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProvider.java
    • cancel 메서드가 구현되어 토스 결제 취소 API를 호출합니다.
    • paymentKeyStore가 추가되어 paymentKey를 저장 및 조회합니다.
    • confirm 메서드에 @CircuitBreaker@Bulkhead 어노테이션이 적용되고 fallback 메서드가 추가되었습니다.
    • RestClient에 연결 및 읽기 타임아웃이 설정되었습니다.
    • @Profile에 "test" 프로파일이 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/PaymentGatewayApplicationTests.java
    • @ActiveProfiles("dev") 어노테이션이 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/api/PaymentGatewayControllerTest.java
    • PaymentGatewayController/payments/cancel 엔드포인트에 대한 테스트 코드가 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/ProviderRouterTest.java
    • ProviderRoutercancel 메서드 라우팅 및 예외 처리 테스트 코드가 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/StubPaymentProviderTest.java
    • StubPaymentProvidercancel 메서드 동작 테스트 코드가 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProviderResilienceTest.java
    • TossPaymentProvider의 복원력 패턴 (Circuit Breaker, Bulkhead) 동작에 대한 통합 테스트 코드가 추가되었습니다.
  • payment-gateway/src/test/java/wisoft/nextframe/paymentgateway/provider/TossPaymentProviderTest.java
    • TossPaymentProviderconfirmcancel 메서드 동작에 대한 단위 테스트 코드가 추가되었습니다.
  • payment/build.gradle
    • Test Containers BOM 버전이 2.0.2로 업데이트되고 개별 모듈 버전이 제거되었습니다.
  • payment/src/main/java/wisoft.nextframe/payment/domain/payment/event/PaymentApprovedEvent.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/PaymentService.java
    • TicketingClient 의존성이 추가되었습니다.
    • confirmPayment 로직이 PG 승인 후 티켓 발급을 동기적으로 호출하고, 실패 시 PG 취소 및 결제 실패를 처리하도록 수정되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/PaymentGatewayExternalCallFailedException.java
    • 새로운 예외 클래스가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/PaymentGatewayTemporarilyUnavailableException.java
    • 새로운 예외 클래스가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueExternalCallFailedException.java
    • 패키지가 wisoft.nextframe.payment.application.payment.outbox.ticketissue에서 wisoft.nextframe.payment.application.payment.exception으로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueInvalidResponseException.java
    • 패키지가 wisoft.nextframe.payment.application.payment.outbox.ticketissue에서 wisoft.nextframe.payment.application.payment.exception으로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/exception/TicketIssueTemporarilyUnavailableException.java
    • 패키지가 wisoft.nextframe.payment.application.payment.outbox.ticketissue에서 wisoft.nextframe.payment.application.payment.exception으로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/handler/PaymentEventHandler.java
    • TicketIssueOutboxService 관련 로직 및 PaymentApprovedEvent 핸들러가 제거되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxRepository.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxService.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueOutboxTarget.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/outbox/ticketissue/TicketIssueRetryUseCase.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/PaymentGateway.java
    • cancelPayment 메서드 및 PaymentCancelResult 레코드가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/ReservationReader.java
    • getPerformanceDateTime 메서드가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/TicketIssueResult.java
    • 패키지가 wisoft.nextframe.payment.application.payment.outbox.ticketissue에서 wisoft.nextframe.payment.application.payment.port.output으로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/payment/port/output/TicketingClient.java
    • TicketIssueResult의 import 경로가 변경되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundCancelFailedException.java
    • 새로운 예외 클래스가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundService.java
    • 환불 로직이 RefundTransactionServicePaymentGateway를 사용하여 재구현되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/refund/RefundTransactionService.java
    • 새로운 서비스 클래스가 추가되어 환불 준비 및 완료 트랜잭션 로직을 포함합니다.
  • payment/src/main/java/wisoft/nextframe/payment/application/refund/port/output/RefundRepository.java
    • 새로운 인터페이스가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/domain/payment/Payment.java
    • PaymentApprovedEvent 발행 로직이 제거되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/domain/payment/PaymentIssuer.java
    • @Component 어노테이션이 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/global/PaymentGlobalExceptionHandler.java
    • PaymentGatewayExternalCallFailedExceptionPaymentGatewayTemporarilyUnavailableException 핸들러가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/DbReservationReader.java
    • getPerformanceDateTime 메서드가 구현되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/PaymentMapper.java
    • RefundMapperJpaRefundRepository 의존성이 추가되었습니다.
    • toDomain 메서드에서 환불 이력을 매핑하도록 수정되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapter.java
    • 새로운 어댑터 클래스가 추가되어 PaymentGateway 인터페이스를 구현하고 Resilience4j를 적용합니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/StubPaymentGatewayAdapter.java
    • 파일 이름 및 패키지가 StubPaymentGatewayAdaptor에서 StubPaymentGatewayAdapter로 변경되었고, cancelPayment 메서드가 구현되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/TicketingAdaptor.java
    • 파일 이름 및 패키지가 TicketingAdaptor에서 TicketingAdapter로 변경되었고, TicketIssueResult의 import 경로가 변경되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/dto/TicketIssueRequest.java
    • 패키지가 wisoft.nextframe.payment.infra.payment.outbox.ticketissue.dto에서 wisoft.nextframe.payment.infra.payment.adapter.dto로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adapter/dto/TicketIssueResponse.java
    • 패키지가 wisoft.nextframe.payment.infra.payment.outbox.ticketissue.dto에서 wisoft.nextframe.payment.infra.payment.adapter.dto로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/adaptor/HttpPaymentGatewayAdaptor.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/JpaTicketIssueOutboxRepository.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxEntity.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxRepositoryImpl.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/payment/schedule/TicketIssueScheduler.java
    • 파일이 삭제되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/refund/JpaRefundRepository.java
    • 새로운 JPA 저장소 인터페이스가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundEntity.java
    • 패키지가 wisoft.nextframe.payment.domain.refund에서 wisoft.nextframe.payment.infra.refund로 이동되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundMapper.java
    • 패키지가 wisoft.nextframe.payment.domain.refund에서 wisoft.nextframe.payment.infra.refund로 이동되었고, @Component 어노테이션이 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/infra/refund/RefundRepositoryImpl.java
    • 새로운 저장소 구현체가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/presentation/refund/RefundController.java
    • 새로운 REST 컨트롤러가 추가되어 환불 요청을 처리합니다.
  • payment/src/main/java/wisoft/nextframe/payment/presentation/refund/dto/RefundApprovedData.java
    • 새로운 DTO 레코드가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/presentation/refund/dto/RefundRequest.java
    • 새로운 DTO 레코드가 추가되었습니다.
  • payment/src/main/java/wisoft/nextframe/payment/presentation/ticketissue/TicketIssueRetryAdminController.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/application/RefundServiceTest.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/application/payment/PaymentEventHandlerTest.java
    • PaymentApprovedEvent 관련 테스트가 제거되고 PaymentFailedEvent 테스트로 변경되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/application/payment/PaymentServiceIntegrationTest.java
    • TicketingClient 모킹이 추가되었습니다.
    • TicketIssueOutbox 관련 테스트가 제거되었습니다.
    • 티켓 발급 실패 시 PG 취소 및 결제 실패 처리 테스트가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/application/refund/RefundTransactionServiceTest.java
    • 새로운 단위 테스트 클래스가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/domain/fixture/RefundEntityFixture.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/domain/payment/PaymentIssuerTest.java
    • 새로운 단위 테스트 클래스가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/domain/payment/PaymentTest.java
    • 패키지가 wisoft.nextframe.payment.domain에서 wisoft.nextframe.payment.domain.payment로 이동되었고, PaymentApprovedEvent 관련 테스트가 제거되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/domain/refund/RefundPolicyStatusTest.java
    • 패키지가 wisoft.nextframe.payment.domain에서 wisoft.nextframe.payment.domain.refund로 이동되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/domain/refund/RefundTest.java
    • 패키지가 wisoft.nextframe.payment.domain에서 wisoft.nextframe.payment.domain.refund로 이동되었고, cannotApproveAfterRejected 테스트가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapterCircuitBreakerTest.java
    • 새로운 통합 테스트 클래스가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/HttpPaymentGatewayAdapterTest.java
    • 새로운 단위 테스트 클래스가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/adapter/StubPaymentGatewayAdapterTest.java
    • 파일 이름 및 패키지가 StubPaymentGatewayAdaptorTest에서 StubPaymentGatewayAdapterTest로 변경되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/outbox/ticketissue/TicketIssueOutboxRepositoryImplTest.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/persistence/PaymentMapperTest.java
    • RefundMapperJpaRefundRepository 모킹이 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/persistence/RefundMapperTest.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/payment/schedule/TicketIssueSchedulerTest.java
    • 파일이 삭제되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundEntityFixture.java
    • 패키지가 변경되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundMapperTest.java
    • 패키지가 변경되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/infra/refund/RefundRepositoryImplTest.java
    • 새로운 단위 테스트 클래스가 추가되었습니다.
  • payment/src/test/java/wisoft/nextframe/payment/repository/PaymentRepositoryImplTest.java
    • 파일이 삭제되었습니다.
  • payment/src/test/resources/schema-test.sql
    • ticket_issue_outbox 테이블이 삭제되었습니다.
    • refunds 테이블이 추가되었습니다.
    • schedules 테이블이 추가되었습니다.
    • reservations 테이블에 schedule_id 컬럼이 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/controller/performance/PerformanceController.java
    • 공연 검색을 위한 /search GET 엔드포인트가 추가되었습니다.
    • PerformanceSearchSortPerformanceSearchResponse import가 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchCondition.java
    • 새로운 레코드 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchSort.java
    • 새로운 enum 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/response/PerformanceSearchResponse.java
    • 새로운 레코드 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/repository/performance/PerformanceSearchPort.java
    • 새로운 인터페이스가 추가되었습니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/repository/performance/QueryDslPerformanceSearchAdapter.java
    • 새로운 어댑터 클래스가 추가되어 PerformanceSearchPort를 구현합니다.
  • schedule-reservation-ticketing/src/main/java/wisoft/nextframe/schedulereservationticketing/service/performance/PerformanceService.java
    • PerformanceSearchPort 의존성이 추가되었습니다.
    • searchPerformances 메서드가 추가되었습니다.
  • schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/builder/PerformanceStatisticBuilder.java
    • withAverageStar 메서드가 추가되었습니다.
  • schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/controller/performance/PerformanceSearchControllerTest.java
    • 새로운 컨트롤러 테스트 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/dto/performance/search/request/PerformanceSearchConditionTest.java
    • 새로운 단위 테스트 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/repository/performance/QueryDslPerformanceSearchAdapterTest.java
    • 새로운 통합 테스트 클래스가 추가되었습니다.
  • schedule-reservation-ticketing/src/test/java/wisoft/nextframe/schedulereservationticketing/service/performance/PerformanceServiceSearchTest.java
    • 새로운 서비스 테스트 클래스가 추가되었습니다.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/reusable-build.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.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

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-gateway with 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.

Comment thread payment/src/test/resources/schema-test.sql
Comment thread payment/src/main/java/wisoft/nextframe/payment/infra/payment/PaymentMapper.java Outdated
Comment thread .github/workflows/reusable-build.yml
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 구현, Toss Payments 연동 및 Resilience4j를 이용한 복원력 패턴 적용 등 중요한 기능 추가와 개선이 많이 이루어졌습니다. 특히 외부 연동에 대한 안정성을 높이려는 노력이 돋보입니다. 그러나 몇 가지 아키텍처 및 구현 관련하여 심각한 우려 사항이 발견되었습니다. paymentKey를 인메모리 맵에 저장하는 방식은 데이터 유실 위험이 매우 크며, 티켓 발급 로직에서 아웃박스 패턴을 제거하고 동기식 보상 트랜잭션으로 변경한 것은 시스템의 안정성을 크게 저하시킬 수 있습니다. 이러한 부분들은 프로덕션 환경에서 심각한 문제로 이어질 수 있으므로 반드시 재검토가 필요합니다. 그 외에도 코드의 안정성과 유지보수성을 높이기 위한 몇 가지 제안 사항을 포함했습니다.

git-mesome and others added 5 commits February 24, 2026 19:47
[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 컬럼 추가
- 영향받는 모든 테스트 갱신
@git-mesome git-mesome merged commit ab2fd4b into develop Feb 24, 2026
8 of 9 checks passed
@git-mesome git-mesome deleted the #164-feat-payment-refund-api branch February 24, 2026 10:57
@git-mesome git-mesome added status: done 완료됨 and removed status: review 코드 리뷰 중 labels Feb 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status: done 완료됨 type: chore 빌드 관련 수정, 패키지 매니저 설정 등 type: feature 새로운 기능 요청 또는 구현 type: improvement 기존 기능 개선 type: test 테스트 코드 추가/수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 환불 API 생성

3 participants