정지 파트너 결제 메시지를 컨트롤러 입구에서 즉시 차단
목차
정지 파트너인데 메시지가 계속 들어옴
이커머스 결제 플랫폼에서 파트너를 정지시켰는데, 결제대행사 쪽 모니터링 메시지가 계속 들어오는 문제가 발견됨. 정지 사유가 사기 의심이든 계약 해지든, 일단 정지 걸린 시점부터는 어떤 입금/결제 이벤트도 우리 시스템 안쪽으로 흘러들면 안 됐음.
문제는 컨트롤러에서 메시지를 받자마자 파싱 → 매칭 → 잔액 반영까지 한 번에 흘러간다는 거였음. 파트너 정지 체크가 잔액 처리 직전에야 들어가서, 이미 로그/이력에는 한 줄씩 쌓이고 있었음.
차단 위치를 앞으로 당김
가장 단순한 답은 입구에서 막는 것. 컨트롤러 진입 직후 파트너 식별만 끝나면 바로 정지 여부를 검사하고 403을 내림.
- 정지 상태:
403 SUSPENDED - 정상 상태: 기존 흐름 그대로
- 파트너 식별 실패: 기존 4xx 유지 (건드리지 않음)
if (partner.suspended) {
return 403 "SUSPENDED"
}
응답 본문을 굳이 길게 만들지 않은 이유는, 모니터링 측이 상태코드 + 코드 문자열만 보고 재시도 정책을 정하기 때문. JSON 키 늘리면 오히려 양쪽 다 손봐야 함.
의외로 헷갈렸던 부분
- 재시도 폭주 우려: 403을 무한 재시도하는 클라이언트가 있을까 걱정했는데, 명시적으로 SUSPENDED 코드를 박아두니 재시도 없이 dead letter로 빠져서 다행이었음
- 이력은 남겨야 함: 차단했다고 흔적을 0줄 남기면 나중에 "왜 안 들어왔냐" 추적이 불가능. 차단 자체는 별도 로그에 기록함
- 정지 직전 in-flight 메시지: 정지 시점에 이미 큐에 들어온 건은 그대로 처리됨. 정책상 "정지 시각 기준" 컷이 명확해서 OK로 결정
회고
| 항목 | 처음 생각 | 실제 적용 |
|---|---|---|
| 차단 위치 | 잔액 반영 직전 | 컨트롤러 입구 |
| 응답 코드 | 400 | 403 + SUSPENDED |
| 로그 | 안 남김 | 별도 차단 로그 |
| 본문 스키마 | 상세 사유 JSON | 코드 문자열만 |
핵심은 막을 거면 가장 앞에서 막자. 비즈니스 로직 안쪽까지 끌고 들어가면 부작용 정리할 게 자꾸 늘어남. 입구에서 한 줄로 끝내는 게 추적할 때도, 모니터링 쪽에서 재시도 정책 잡을 때도 깔끔함.
같은 패턴은 다른 외부 인입 엔드포인트에도 그대로 복붙 가능해서, 이번 김에 "정지 파트너 차단"을 공통 가드로 만들어둘지 다음 작업으로 메모해둠.
다음
댓글 0
첫 댓글 달아줘.