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 |