개발 slecs

결제 매칭과 파트너 귀속 로직을 단계별로 분리해 동명이인 버그 해결

목차

시작점

주문 매칭과 파트너 결정 로직이 한 유틸 안에 뒤엉켜 있었음. 입금 들어오면 어떤 주문에 매칭할지, 그 주문이 어떤 파트너 소속인지, 수수료를 누가 부담하는지 한 메서드 안에서 다 처리했음. 이번 리팩토링은 이걸 떼어내는 작업.

기존 흐름에서 가장 골치 아팠던 부분:

  • 매칭 후보가 여러 개일 때 우선순위 결정 분기가 6단계 넘게 중첩
  • 파트너 결정 로직이 매칭 로직 중간에 끼어들어가 있어 단위 테스트 분리 불가
  • 동명이인·동일 금액 케이스에서 잘못된 파트너로 귀속되는 버그가 간헐적으로 발생

분리한 책임

매칭과 파트너 결정을 독립 단계로 쪼갰음.

단계 입력 출력
1차 매칭 입금 이벤트 후보 주문 목록
우선순위 정렬 후보 목록 단일 주문
파트너 결정 확정 주문 귀속 파트너

이렇게 끊고 나니 각 단계를 별도로 테스트 가능해졌음. 특히 우선순위 정렬은 순수 함수로 떨어졌고, 파트너 결정은 계층 구조 조회만 남아서 모킹 부담이 확 줄었음.

이전: 입금  [매칭 + 정렬 + 파트너 + 수수료]  덩어리
이후: 입금  매칭  정렬  파트너  수수료(별도 단계)

회고 포인트

  • 버그 고치기 전에 구조부터 바꾼 게 정답이었음. 처음엔 동명이인 케이스만 핀포인트로 패치하려 했는데 분기 추가할 자리가 마땅치 않았음. 결국 분리 안 하면 또 새 버그 생길 구조였음.
  • 표로 정리하니 빠진 케이스가 보였음. 매칭·정렬·귀속을 표로 그려보고 나서 "환불 후 재입금 케이스에서 정렬 기준이 모호하다"는 걸 발견. 코드만 보고 있을 땐 안 보였던 구멍.
  • 파트너 결정에서 상위 계층 마진 계산을 분리한 게 컸음. 수수료 차액이 상위 에이전트 수익으로 가는 구조라 매칭 단계랑 섞여 있으면 영원히 못 풀 뻔했음. 매칭은 "어떤 주문인가"만 답하고, 귀속·마진은 그 뒤 단계에서 처리하는 게 자연스러움.

다음에 또 만나면

  • 후보 정렬 우선순위를 코드가 아닌 설정 테이블로 빼고 싶음. 영업 정책 바뀔 때마다 코드 푸시하는 건 비효율적.
  • 매칭 실패 사유의 코드화. 지금은 "매칭 안 됨"으로 뭉뚱그려져 있어서 운영팀이 원인을 못 봄. 사유 enum 만 추가해도 운영 문의가 절반은 줄 듯.
  • 정렬 단계 입력·출력에 스냅샷 테스트를 박아두기. 후일 누가 분기 끼워넣어도 회귀가 즉시 잡히게.

다음

댓글 0

첫 댓글 달아줘.