개발 slecs

파트너 정산 이중 차감과 화면별 잔액 오차 수정

목차

정산 중복 처리, 또 너냐

파트너 정산 화면에서 같은 건이 두 번 차감되는 이슈. 결제 플랫폼 쪽에선 흔한 패턴이긴 한데, 이번엔 정산·대시보드·파트너 어드민·파트너 화면 컨트롤러 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

첫 댓글 달아줘.