파트너 정산 이중 차감과 화면별 잔액 오차 수정
목차
정산 중복 처리, 또 너냐
파트너 정산 화면에서 같은 건이 두 번 차감되는 이슈. 결제 플랫폼 쪽에선 흔한 패턴이긴 한데, 이번엔 정산·대시보드·파트너 어드민·파트너 화면 컨트롤러 4개를 동시에 손봐야 했음. 한 곳만 고치면 다른 화면에서 다시 어긋나서, 결국 합계 산식을 원장 수준에서 한 번에 정리함.
무엇이 문제였나
- 충전 수수료, 결제 수수료, 판매대금 3건이 PENDING 상태로 들어가야 하는데, 일부 경로에서 PENDING 없이 즉시 차감됨
- 대시보드 합계 쿼리가 CONFIRMED + PENDING 을 둘 다 더해서 이중 집계
- 어드민에서 환불 시 PENDING 건이 CANCELLED 로 가지 않고 그대로 살아남음
- 파트너 화면 잔액과 어드민 잔액이 같은 데이터인데 다르게 표시
3번이 제일 골치였음. 환불 분기에서 상태 전환 로직이 빠져 있어서, 잔액은 차감됐는데 PENDING 건은 살아남아 다시 차감되는 구조.
수정 포인트
| 영역 | 증상 | 처리 |
|---|---|---|
| 정산 | 즉시 차감 | PENDING 생성으로 변경 |
| 대시보드 | 이중 집계 | 상태 필터 추가 |
| 어드민 | 환불 누락 | CANCELLED 전환 추가 |
| 파트너 화면 | 잔액 오차 | 합계 산식 통일 |
핵심은 합계 산식 통일. 화면마다 SUM 조건이 미묘하게 달라서 같은 데이터를 다르게 보여주는 상황이었음.
-- 화면마다 다르게 쓰던 산식
SELECT SUM(amount) FROM ledger WHERE partner_id = ?
-- 정정 후 (상태별 분리, 한 곳에서만 정의)
SELECT
SUM(CASE WHEN status='CONFIRMED' THEN amount ELSE 0 END) AS confirmed_amt,
SUM(CASE WHEN status='PENDING' THEN amount ELSE 0 END) AS pending_amt,
SUM(CASE WHEN status='CANCELLED' THEN amount ELSE 0 END) AS cancelled_amt
FROM ledger
WHERE partner_id = ?
회고
- 상태 머신을 코드보다 먼저 종이에 그렸어야 했음. PENDING → CONFIRMED / CANCELLED 흐름이 머릿속에만 있으니 분기 누락이 반복됨
- 합계 쿼리는 한 군데서만 만들고 재사용. 화면마다 SUM 새로 짜는 순간 버그가 자라기 시작
- 회계 수치는 추정·반올림 금지. 한 번 어긋나면 정산 끝날 때까지 따라옴
- 같은 도메인 컨트롤러 4개를 한 PR로 묶은 건 잘한 선택이었음. 화면별로 나눠 고쳤으면 중간 상태에서 또 다른 모순이 생겼을 듯
다음
댓글 0
첫 댓글 달아줘.