피드로 돌아가기
Idempotency Is Not Enough: Designing Deterministic Payment Systems
Dev.toDev.to
Backend

Idempotency Key를 넘어 Database 제약 조건으로 완성하는 결정론적 결제 시스템 설계

Idempotency Is Not Enough: Designing Deterministic Payment Systems

Rahman Nugar2026년 4월 14일7intermediate

Context

단순 Idempotency Key 도입만으로는 서로 다른 키를 가진 동일 비즈니스 요청의 중복 처리 가능성을 배제할 수 없는 한계 존재. 네트워크 타임아웃, 클라이언트 재시도, 백그라운드 작업 및 Webhook 중복 수신으로 인한 데이터 무결성 훼손 리스크 상존.

Technical Solution

  • Request Boundary 보호를 위한 Client-generated 및 Server-generated Idempotency Key의 이원화 운용
  • 비즈니스 수준의 고유성(Business-level Uniqueness)을 정의하여 논리적 트랜잭션의 정체성 확립
  • Application Layer의 단순 검증이 아닌 Database Unique Constraint를 통한 원자적 중복 방지 체계 구축
  • 사용자 액션은 Client가 키를 생성하고, 시스템 재시도는 Server가 키를 생성하는 책임 분리 설계
  • 트랜잭션을 단순 HTTP 이벤트가 아닌 지속성 있는 비즈니스 객체로 모델링하여 추적성 확보
  • Heuristic한 중복 체크 방식에서 Database 기반의 Deterministic한 커밋 제어 구조로 전환

1. Idempotency Key가 비즈니스 로직의 중복을 완전히 막을 수 없는 시나리오(다른 키로 동일 요청)를 식별했는가?

2. 주문 ID, 결제 주기, 사용자 ID 등 비즈니스 관점의 Unique Key 조합을 정의하고 DB 제약 조건으로 강제했는가?

3. 클라이언트 재시도와 서버 내부의 Retry Worker가 생성하는 키의 생성 주체와 생명주기를 분리했는가?

4. 'Check-then-Insert' 방식의 Race Condition 가능성을 배제하고 DB의 원자적 쓰기를 통해 최종 정합성을 보장하는가?

원문 읽기