가상계좌 입금자명 매칭 실패를 알림 title 폴백으로 해결
목차
입금자명, 왜 갑자기 title에서 빼야 했나
며칠 전부터 가상계좌 입금 매칭 실패율이 슬금슬금 올라감. 이상하다 싶어서 알림 원본 페이로드 까봤더니, 원인이 어이없었음. 카카오 쪽에서 내려주는 알림 본문(body) 포맷이 일부 케이스에서 바뀌어 있었음. 기존엔 본문에 홍길동님 1,000,000원 입금 식으로 깔끔하게 들어왔는데, 어느 순간부터는 본문에 금액만 찍히고 입금자명은 title에 박혀서 오는 케이스가 섞여 들어옴.
문제는 알림 수집기가 본문만 정규식으로 긁어 쓰고 있었다는 거임. title은 그냥 로깅용으로만 들고 있었음. 즉 입금자명을 못 뽑아내니 매칭 후보가 비어버리고, 그대로 미매칭 대기열로 흘러 들어감. 파트너 쪽에서 "왜 입금했는데 충전 안 됐냐"고 문의 들어오기 시작했고, 그제서야 알림 포맷이 둘로 갈라져 있다는 걸 인지함.
어떻게 고쳤나
원칙은 단순하게 잡음. body 우선, 그래도 못 뽑으면 title fallback. 한 곳에서 둘 다 시도하게.
fun extractDepositor(title: String, body: String): String? {
return BODY_PATTERN.find(body)?.groupValues?.get(1)
?: TITLE_PATTERN.find(title)?.groupValues?.get(1)
}
title 쪽 정규식은 따로 팀. body 패턴을 그대로 돌리면 매칭이 어긋남. 키 포인트는 두 가지였음.
- title 포맷이
[입금] 홍길동 1,000,000원처럼 prefix가 붙어 있어서 대괄호 토큰을 먼저 떼어내야 함 - 입금자명 뒤에 숫자/콤마/원이 붙는 경계를 명시적으로 잡지 않으면 이름에 숫자 포함된 케이스에서 깨짐
테스트 케이스는 실제 미매칭 대기열에서 뽑아온 페이로드 12건으로 구성함. 합성 데이터로 짜면 또 놓치는 패턴이 생길 것 같았음.
분기 케이스 정리
| 케이스 | body 입금자명 | title 입금자명 | 추출 경로 |
|---|---|---|---|
| 구버전 | 있음 | 없음 | body |
| 신버전 A | 없음 | 있음 | title fallback |
| 신버전 B | 있음 | 있음 | body 우선 |
| 광고/프로모 | 없음 | 없음 | null → 미매칭 큐 유지 |
마지막 케이스가 살짝 신경 쓰였음. 광고성 푸시까지 입금 알림으로 오인되면 안 되니까, 금액 패턴이 본문에 있는지 한 번 더 게이트를 검. 금액이 없으면 입금 알림 자체로 보지 않고 스킵.
회고
- 로그를 page 단위로 한 번씩 까보는 습관이 또 한 번 살림. 매칭률 그래프만 봤으면 원인 파악에 더 걸렸을 것
- 외부 알림 포맷은 무조건 변한다고 가정해야 함. body 한 곳만 파싱하던 게 게으름이었음. fallback 경로를 처음부터 깔아뒀어야 함
- 알림 원문은 일정 기간 raw로 남겨두는 게 진짜 자산. 이번에 변경 시점을 역추적할 수 있었던 것도 raw payload를 14일 보관하고 있어서였음
다음.
댓글 0
첫 댓글 달아줘.