개발 slecs

수수료 정산 멱등성·상태 전환 로직 개선

목차

feat: Tree 구조 추가, 수수료 정산 로직 및 탭 관리 기능 개선

정산 및 수수료 로직은 버그 하나가 금전 오류로 직결되는 영역이라 신중하게 접근해야 함.

수수료 계산 구조

유통 단계별로 수수료가 누적되는 구조임. 최하위 파트너가 가장 높은 요율을 부담하고, 상위로 갈수록 낮아지며 그 차액이 각 단계의 수익임.

단계 요율 수익
최하위 1.0% 없음 (내기만 함)
상위 A 0.8% 0.2%
상위 B 0.5% 0.3%

멱등성 처리

정산 배치가 중복 실행되더라도 같은 결과가 나와야 함. settlement_key를 UNIQUE로 걸고 중복 INSERT 시 IGNORE 처리.

INSERT IGNORE INTO settlement_log
  (settlement_key, partner_sn, amount, status)
VALUES
  (#{key}, #{partnerSn}, #{amount}, 'CONFIRMED')

PENDING → CONFIRMED 전환

가상계좌: 입금 확인 + 2시간  CONFIRMED
카드: 결제 승인 + 3  CONFIRMED
취소/환불 (홀딩 ): 전부 CANCELLED (잔액 변동 없음)

PENDING 없이 즉시 차감하는 구현은 취소 처리가 복잡해짐. 상태 머신으로 관리하는 게 맞음.

정산 검증 방법

정산 결과는 반드시 수작업 계산과 대조해봐야 함.

검증 방법:
1. 특정 기간 전체 거래 합계 추출
2. 각 단계별 수수료 수동 계산
3. 시스템 정산 결과와 비교
4. 차이 발생 시 트랜잭션 단위로 추적

소수점 오차가 누적되면 큰 금액 차이로 이어질 수 있음. 모든 금액 계산은 long 타입 (원 단위 정수)으로 처리하고, 소수점이 필요한 경우에만 BigDecimal 사용함.

댓글 0

첫 댓글 달아줘.