입금 매칭 우선순위 정리로 결제 연동 모듈 구조 개선
목차
무엇을 손봤나
특정 은행 입금 연동 모듈을 정리했음. 기존 코드는 UI 렌더링, 입금 콜백 파싱, 잔액 갱신이 한 클래스에 다 들어있어서 손대기 무서운 상태였음. 한 줄 바꾸면 어디서 터질지 모르는 전형적인 레거시.
이번엔 두 갈래로 쪼갰음.
- 표시 레이어: 파트너 화면에서 보여주는 입금 안내 / 계좌 표기 부분
- 처리 레이어: 결제대행사에서 들어오는 통보 페이로드 검증 + 매칭 + 잔액 반영
로직 정리하면서 발견한 것들
가장 골 때린 건 입금 매칭 키였음. 송금자명, 금액, 시각 세 가지 중 어느 걸 1순위로 쓸지가 코드 곳곳에서 다르게 처리되어 있었음. 동일 금액 입금이 동시에 들어오면 엉뚱한 충전건에 붙어버리는 케이스가 잠재해 있었던 거.
매칭 우선순위를 표로 정리해서 합의 후 한 곳에 모았음.
| 순위 | 키 | 비고 |
|---|---|---|
| 1 | 가상계좌 번호 | 발급 시점에 1:1 매핑 |
| 2 | 송금자명 + 금액 | 일반 계좌 입금 |
| 3 | 금액 단독 | 폴백, 수동 확인 큐로 |
3순위는 자동 매칭 안 하고 운영자 확인 큐로 빼는 게 맞다고 결론.
코드 단순화 포인트
분기 덕지덕지 붙은 부분을 이렇게 단순화.
val matched = strategies
.firstNotNullOfOrNull { it.match(notice) }
?: pendingQueue.enqueue(notice)
전략 객체 리스트로 바꾸니까 새 매칭 규칙 추가할 때 if 추가가 아니라 strategy 한 개 등록으로 끝남. 테스트 작성도 훨씬 편해졌음.
회고
- UI랑 로직 섞인 거 분리하는 작업은 항상 생각보다 오래 걸림. 화면 한 줄 바꾸려고 들어갔는데 콜백 파서까지 손보고 있는 자신을 발견함.
- 매칭 우선순위처럼 "암묵적 합의"로 굴러가던 정책은 표로 박아두고 코드 주석 대신 PR 본문에 남기는 게 더 오래 살아남음.
- 폴백 케이스를 자동 처리로 욱여넣지 말고 사람 확인 큐로 빼는 게 사고 방지에 훨씬 효과적이었음.
다음
댓글 0
첫 댓글 달아줘.