송금 URL로 은행 자동 판별하는 구조 짜기
목차
캡처된 송금 URL을 어떻게 받을지 고민함
스마트폰에서 연락처 송금을 누르면 은행 앱이 뜨는 게 일반적인데, 우리는 한 칸 앞에 끼어들어야 했음. 사용자가 송금 직전에 URL을 캡처해 넘겨주면, 그걸 보고 어느 은행인지 판별하고 후속 흐름을 잇는 구조.
문제는 은행마다 URL 포맷이 제각각이라는 점.
은행 판별을 어떻게 짰나
처음엔 정규식 한 줄로 끝낼 줄 알았음. 막상 캡처 샘플을 늘어놓으니 결이 다 달랐음.
| 시그니처 | 식별 위치 |
|---|---|
| 호스트 도메인 | scheme + host |
| 쿼리 파라미터 키 | query string |
| path 접두 | path 첫 segment |
세 갈래로 나누고, 각 은행을 enum 형태로 묶어 매칭 우선순위를 줬음.
1) host 매칭 → 가장 신뢰도 높음
2) path prefix → host 변경 대비
3) query 시그니처 → 마지막 보루
컨트롤러는 얇게, 유틸은 두껍게
URL 수신 엔드포인트는 문자열 하나 받고, 유틸에 위임하고, 판별 결과 + 정규화된 식별자만 응답하게 함. 컨트롤러에 분기 안 넣고 유틸이 전부 책임지게 함.
- 컨트롤러: 입출력 직렬화만
- 유틸: 정규화, 매칭, 결과 객체 생성
- 테스트: 유틸만 단위테스트로 후려치면 끝
이렇게 갈라두니 새 은행 추가될 때 컨트롤러는 안 건드리고 유틸 안에서만 끝남. 다음에 결제대행사 쪽에서 새 패턴 던져도 흡수 가능한 형태가 됨.
삽질 포인트
- 일부 URL이 표준 스킴이 아니라 앱 전용 스킴으로 떨어져서 URI 파서가 throw함. try-catch로 감싸고 raw string fallback 깔았음.
- URL 인코딩이 뒤섞여 있어서 동일 은행인데 매칭 못한 케이스가 있었음. decode 한 번 거친 뒤 재매칭.
- 파라미터 이름이 같은데 의미 다른 은행이 둘 있었음. host 우선순위 안 깔아뒀으면 오판할 뻔함.
회고
처음엔 "이거 30분컷이지" 했는데 캡처 샘플 모으다가 반나절 갔음. 결국 실데이터 확보가 절반이었고, 코드는 그 다음 정리 작업이었음. 외부 입력 다루는 일은 항상 실데이터 확보가 선행되어야 한다는 걸 다시 체감함.
판별 로직은 단순할수록 좋다는 결론도 같이 얻음. 화려한 정규식 한 방보다 host → path → query 순으로 내려가는 단조로운 사다리가 디버깅하기 편했음.
다음
댓글 0
첫 댓글 달아줘.