CMS 자동이체 기반 구독 시스템

등록 중 이탈로 남은 서명 대기 건과 쓰지 않는 계좌를 일일 정리 배치로 해소

결제수단 등록에서 첫 출금까지의 흐름, 중간에 끊기면 남는 상태(빨간 상자)와 이를 매일 정리하는 배치 단계

결제수단 등록과 첫 출금 흐름, 중간에 끊기면 남는 상태와 이를 정리하는 배치 단계 매일 04시 정리 배치의 단계별 대상, 효성CMS 처리, DB 상태 변화

문제와 배경

  • 사장님이 결제수단 등록을 요청하면 서버는 등록 건을 서명 대기 상태로 저장하고 효성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 계좌까지 삭제됨.