문제
첫 결제 적립을 받은 주문이 판매자 잘못으로 전부 취소되면 적립금은 회수되는데, 첫 결제 이력은 이미 쓴 것으로 남습니다. 고객은 혜택도, 다시 받을 기회도 잃습니다.
그래서 문제를 “다음 결제에서 첫 결제 혜택을 다시 받을 자격을 되살리는 것”으로 정했습니다.
접근
- 기획 문서(PRD)를 바탕으로 HLD 1건과 LLD 2건을 쓰고 개발로 넘어가는 순서로 진행했습니다.
- 설계 기준은 같은 요청이 여러 번 와도 한 번만 처리할 것, 같은 고객의 요청은 동시에 하나만 진행할 것, 받는 쪽이 조건을 다시 확인한 뒤에만 복원을 부를 것이었습니다.
결정
- 주문 상태가 바뀌면 같은 트랜잭션 안에서 아웃박스에 기록하고, 기록은 Kafka로 전달됩니다.
- 받는 쪽은 조건을 다시 확인한 뒤 결제 쪽 복원 API를 부르고 결과를 저장합니다.
- 중복 방지 키로 같은 요청은 한 번만 처리하고, 고객 단위 잠금과 CAS(값을 비교한 뒤 바꾸기)로 같은 고객의 요청이 동시에 진행되지 않게 합니다.
- 작업은 대기, 준비, 예약, 발송 중, 확인 5개 상태를 거칩니다.
결과
- 이번 범위는 외부 API 연동 검증까지이고, 환불 이벤트와 연결하는 자동 복원은 남은 정책이 정해진 뒤에 진행합니다.
기록과 자동화
- 문서: HLD 1건과 LLD 2건을 남겼습니다.
- 프로세스 자동화: 주문 상태 변경부터 조건 확인, 복원 요청, 결과 저장까지 이벤트로 이어지는 흐름을 설계했고, 환불 이벤트와의 연결은 정책이 정해진 뒤로 미뤘습니다.