spring_2기[본캠프]/과제

[과제] 결제 시스템 Day5

minwoo95 2026. 2. 11. 21:18

https://github.com/teeeam3/payment-assignment

 

GitHub - teeeam3/payment-assignment: 결제 도메인 프로젝트입니다

결제 도메인 프로젝트입니다. Contribute to teeeam3/payment-assignment development by creating an account on GitHub.

github.com

 

TIL: 결제 시스템의 보상 트랜잭션 및 도메인 연관 관계 해결

1. Trouble (문제 상황)

  • 컴파일 에러: orderRepository.findById().orElseThrow() 사용 시 람다식 내 예외 객체 생성 과정에서 원인 불명의 컴파일 에러(빨간 줄) 발생.
  • 도메인 간의 불일치: Payment 엔티티만으로는 상품 재고를 복구할 수 없는 구조(상품 ID, 수량 정보 부족).
  • 가독성 저하: 커스텀 예외(OrderNotFoundException)가 타입 추론 문제로 개발 효율을 저하시킴.

2. Shoot (해결 방법)

  • 표준 예외 활용: 불분명한 커스텀 예외 대신 자바 표준 예외인 IllegalArgumentException을 사용하여 타입 추론 문제를 즉시 해결하고 코드 가독성 확보.
  • 보상 트랜잭션 로직 구축: 결제 승인 실패 시 포트원 결제 취소와 동시에 주문 상세(OrderItem)를 조회하여 실제 상품의 재고를 원복하는 로직 구현.
  • 상품명 가공 로직 추가: 결제창에 "상품A 외 N건" 형식을 노출하기 위해 Order 엔티티의 리스트를 활용한 가공 로직을 initiatePayment에 배치.

3. Learned (배운 점)

  • 객체 그래프 탐색의 중요성: Payment -> Order -> OrderItem -> Product로 이어지는 연관 관계를 정확히 이해해야 데이터 무결성을 지킬 수 있음을 확인.
  • 표준 예외의 효율성: 무조건적인 커스텀 예외 생성보다는 표준 예외를 활용하는 것이 때로는 컴파일러와의 싸움을 줄이고 개발 속도를 높이는 "실무적 선택"임을 깨달음.
  • 보상 트랜잭션의 필수성: 분산 환경(PG사 결제)에서는 DB 트랜잭션만으로 해결되지 않는 외부 API 취소 및 재고 복구 로직이 시스템 안정성의 핵심임을 체득.

 

'spring_2기[본캠프] > 과제' 카테고리의 다른 글

[과제] 결제 시스템 Day7  (0) 2026.02.13
[과제] 결제 시스템 Day6  (0) 2026.02.12
[과제] Standard Spring Task 4  (0) 2026.02.10
[과제] 결제 시스템 Day5  (0) 2026.02.10
[과제] 결제 시스템 Day4  (0) 2026.02.09