개발 slecs

연락처 송금 결제수단 추가로 콜백과 매칭 로직 전면 재작성

목차

연락처 송금이 결제수단으로 들어왔을 때

이커머스 결제 흐름에 새 결제수단이 하나 끼어들었음. 기존 카드/가상계좌/포인트 옆에 "연락처 송금"이 들어오는 작업.

처음엔 단순히 결제수단 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

첫 댓글 달아줘.