연락처 송금 결제수단 추가로 콜백과 매칭 로직 전면 재작성
목차
연락처 송금이 결제수단으로 들어왔을 때
이커머스 결제 흐름에 새 결제수단이 하나 끼어들었음. 기존 카드/가상계좌/포인트 옆에 "연락처 송금"이 들어오는 작업.
처음엔 단순히 결제수단 enum 하나 늘리는 줄 알았는데, 까보니 매칭 로직이 본체였음.
매칭이 진짜 일이었음
연락처 기반이라 "보낸 사람 번호"와 "받을 사람 번호"가 정확히 매핑돼야 함. 표기 통일 안 하면 그대로 미매칭으로 빠짐.
| 입력 | 정규화 후 |
|---|---|
| 010-1234-5678 | 01012345678 |
| +82 10 1234 5678 | 01012345678 |
| (010)1234.5678 | 01012345678 |
핵심은 이 정도였음.
String normalized = raw.replaceAll("[^0-9]", "");
if (normalized.startsWith("82")) {
normalized = "0" + normalized.substring(2);
}
이걸 매칭 유틸로 빼고, 결제 콜백에서 단일 진입점으로 호출하게 묶었음.
콜백에서 발목 잡힌 지점
결제대행사 콜백 수신 시 처리 분기를 늘려야 했음. 기존엔 두 갈래라 단순했는데, 연락처 송금은 확정 시점이 다름.
- 카드: 즉시 승인
- 가상계좌: 입금 알림 시점
- 연락처 송금: 수신자 매칭 성공 시점
세 번째가 문제였음. 매칭 실패 시 PENDING으로 두고 재시도 큐에 넣었어야 했는데, 처음엔 바로 FAIL로 떨궜다가 환불 케이스가 꼬임. 정책상 PENDING 유지가 맞아서 다시 짰음.
if (matched) {
confirmTransfer(tx);
} else {
holdAsPending(tx); // FAIL 아님, 재시도 대상
enqueueRetry(tx);
}
화면쪽 변경
- 상세 화면: 결제수단 라벨 + 매칭 상태 뱃지(대기/완료/실패) 추가
- 입력 폼: 수신자 연락처 필드 + 클라이언트단 정규화 선처리
폼에서 미리 정규화하니 서버단 미매칭이 줄었음. 다만 국제번호 케이스가 다양해서 서버 정규화도 그대로 둠. 이중 방어.
회고
- 결제수단 추가 = enum 하나가 아님. 콜백/상태머신/화면 3축 다 건드려야 함
- 매칭 유틸을 별도로 뺀 건 잘한 선택. 단위 테스트 짜기가 편해졌음
- PENDING 상태 정책을 먼저 못 박고 코드 짰어야 했음. 두 번 짠 건 명백히 아쉬움
- 정규화는 클라/서버 둘 다 두는 게 안전. 한쪽만 믿으면 무조건 새는 케이스가 나옴
다음
댓글 0
첫 댓글 달아줘.