CMS 자동이체 기반 구독 시스템
등록 중 이탈로 남은 서명 대기 건과 쓰지 않는 계좌를 일일 정리 배치로 해소
결제수단 등록에서 첫 출금까지의 흐름, 중간에 끊기면 남는 상태(빨간 상자)와 이를 매일 정리하는 배치 단계
문제와 배경
- 사장님이 결제수단 등록을 요청하면 서버는 등록 건을 서명 대기 상태로 저장하고 효성CMS 서명 링크를 보냄. 서명은 효성CMS 웹뷰에서 이뤄져 서버는 서명 완료 웹훅을 받기 전까지 진행 상태를 알 수 없고, 서명이 끝나면 우리 DB의 결제수단과 효성CMS 계좌(효성 용어로 '회원') 양쪽에 상태가 남음.
- 출시 직후 이 흐름 중간에 이탈한 건들이 쌓였음.
- 서명 전 이탈한 등록이 서명 대기로 20건 넘게 남음. 서명 링크에 만료 시한이 없어 언제든 서명될 수 있으니 진행 중인 건과 구분할 수 없었음.
- 서명 후 첫 출금 없이 이탈하면 그 계좌가 대표 결제수단(정기 출금에 쓰는 계좌)으로 남고, 사장님이 다른 계좌로 결제수단을 다시 등록하면 처음 계좌는 대표에서 밀린 채 효성CMS에 남음. 실제로 첫 출금 시한(대표 지정 후 10분)을 넘겨 거절당한 사장님이 다른 계좌를 등록해, 처음 계좌가 쓰이지 않은 채 효성CMS에 남은 일이 있었음.
- 구독이 없으면 결제 계좌도 남기지 않는다는 우리 서비스 정책에 어긋나고, 효성CMS에 남은 출금 동의는 로직 오류가 나면 의도와 다른 출금에 쓰일 수 있음.
- 이탈한 건에는 후속 요청이 없어 서버가 직접 조회해 정리해야 했음. DB에서 등록 상태만 만료로 바꾸면 그 뒤에도 링크로 서명할 수 있어 효성CMS에만 계좌가 생기므로, 서명 링크도 같이 닫아야 했음.
해결 과정
정리 방식 비교
| 후보 | 장점 | 단점과 제약 | 판단 |
|---|---|---|---|
| 요청 시점에 지연 정리 | 추가 구현 없음 | 이탈 건은 후속 요청이 없음 | |
| 건마다 만료 예약 (지연 큐) | 시한이 되자마자 정리 | 지연 큐 인프라가 필요하고, 메시지가 유실되면 보정 수단이 또 필요 | |
| 짧은 주기 스케줄러 (예: 5분) | 정리 지연이 짧음 | 호출만 잦아지고, 시한은 요청 시점에 검사하므로 이득이 적음 | |
| 하루 한 번 정리 배치 | 실행마다 DB에서 대상을 다시 조회해 누락이 없고, 실패 건은 다음 실행에서 재처리 | 정리가 최대 하루 지연 | 채택 |
- 하루로 충분한 건 시한 검사를 웹훅 처리(24시간)와 첫 출금 요청(10분) 시점에 각각 하고, 대표가 아닌 계좌는 정기 출금 대상이 아니어서임. 정리가 지연돼도 잘못된 출금은 없고, 배치는 이 검사가 틀렸을 때의 안전장치.
[1단계] 서명 전 이탈 정리
- 요청 후 24시간이 지나도 서명 대기면 이탈로 판정함. 웹훅 처리도 같은 기준이라 두 판정이 어긋나지 않음.
- 효성CMS를 먼저, DB를 나중에 정리함. 서명 여부를 조회해 서명 전이면 서명 링크를 닫고(간편동의 비활성화) 서명 후면 효성CMS 계좌를 삭제한 뒤 DB의 등록을 만료 처리함. 순서를 바꾸면 그 사이 들어온 서명으로 효성CMS에만 계좌가 생김.
[2단계] 첫 출금 없이 남은 대표 해제
- 대표 지정 후 1시간이 지나도록 구독이 없으면 배치가 대표를 해제함. 1시간은 첫 출금 시한(10분) 직전에 들어온 출금이 아직 처리 중일 수 있어 여유를 둔 값으로, 시한 직후 바로 해제하면 그 출금이 성공해도 대표가 없어 다음 정기 출금이 실패함.
[3단계] 쓰지 않는 계좌 삭제
- 대표가 아닌 결제수단(2단계에서 해제한 계좌, 사장님이 다른 계좌를 등록해 대표에서 밀린 계좌)은 효성CMS 계좌부터 삭제하고 DB에서 폐기 처리함.
결과
- 쌓여 있던 서명 대기 등록을 모두 정리함. 이제 이탈한 등록도 요청 후 최대 이틀 안에 만료 처리되어 서명 대기로 오래 방치되지 않음.
- 첫 출금 없이 남은 대표도 매일 해제되거나 삭제되어 구독하지 않는 마트에 대표나 출금 동의가 남지 않음.
- 만료 처리 뒤 효성CMS에만 계좌가 생기는 일이 없고, 웹훅이 유실돼 DB에 반영되지 못한 서명도 1단계에서 효성CMS 계좌까지 삭제됨.