쿠폰 매입 신청·정산 흐름을 상태머신으로 안정화
목차
쿠폰 매입 신청 관리, 왜 필요했나
이커머스 파트너 정산 흐름에서 발행된 쿠폰 중 안 팔린 잔량을 다시 사들이는 절차가 필요했음. 기존엔 발행 이력만 시스템에 있었고 매입은 메일+엑셀로 수기 처리 중이었음. 운영팀이 월별 분량 늘면서 누락·중복 신청 사고 두 건 터지고 나서야 짬이 남.
설계 핵심
세 흐름으로 분리함:
- 매입 신청 접수 (파트너 측)
- 관리자 검토/승인 (어드민 측)
- 정산 반영 (수수료 차감 + 잔액 갱신)
발행 이력 화면과 매입 신청 화면을 한 컨트롤러에 합치지 않았음. 한 곳에 우겨넣으면 권한·필터·상태머신이 꼬임. 어드민도 매입용/이력용 컨트롤러 둘로 쪼갬.
상태머신
| 상태 | 설명 | 파트너 잔액 |
|---|---|---|
| PENDING | 신청 접수, 검토 대기 | 변동 없음 |
| APPROVED | 승인, 정산 대기 | 변동 없음 |
| SETTLED | 정산 완료 | 매입가 지급 |
| REJECTED | 반려 | 변동 없음 |
| CANCELLED | 신청 취소 | 변동 없음 |
PENDING/APPROVED 단계에선 잔액 손도 안 댐. SETTLED 시점에만 한 번 적용. 이전 프로젝트에서 즉시 차감/지급 박았다가 취소·반려 롤백 누락으로 정산 차이 난 트라우마 때문.
유틸 분리
발행 수량 검증, 매입 가능 수량 계산, 단가 라운딩 같은 도메인 로직은 별도 유틸로 뺐음. 컨트롤러는 얇게 유지.
buybackable = totalIssued - totalRedeemed - alreadyBuyback
amount = buybackable * unitPriceAtIssue
매입 단가는 발행 시점 단가로 못박음. 현재 단가 기준으로 가면 가격 변동 시 분쟁 소지 큼.
회고
- 상태머신 먼저 그리고 나서 화면 짜니 코드가 체감 30% 줄었음
- 컨트롤러 둘로 쪼갠 게 정답. 초안은 한 컨트롤러에 매입+이력 같이 넣었다가 GET 파라미터 충돌로 두 번 갈아엎음
- 매입가 계산 정책(발행 시점 vs 현재 시점) 같은 건 코드 박기 전에 운영팀과 한 줄짜리 합의문 받아두는 게 빠름. 구두 합의로 갔다가 1차 리뷰에서 뒤집힘
- 잔액 변동을 SETTLED 한 곳에서만 일으키니 회계팀 검수도 5분이면 끝남
다음
댓글 0
첫 댓글 달아줘.