Hold 및 결제 상태 전이 통합

Hold 및 결제 상태 전이 통합

ADR-030 Hold 및 결제 상태 전이 통합

1. Metadata

  • ADR ID: ADR-030
  • Status: draft
  • Date: 2026-03-09
  • Owner: YSY

2. Domain Decision

  1. hold는 결제 진행 중 임시 점유 상태로만 사용한다.
  2. Hold 만료 기본값은 90초, 최대값은 180초로 한다.
  3. 결제 재시도 기본값은 2회로 한다. (운영 파라미터로 조정 가능)
  4. payment_method=prepaid 결제 성공 시 상태는 최소 reserved로 확정한다.
  5. payment_method=on_site는 결제 단계 없이 reserved로 진입한다.
  6. redeemed 전환은 verification_method 조건으로 처리한다. (none|location|qr)
  7. verification_method=none이면 reserved -> redeemed를 즉시 전환한다. (prepaid/on_site 공통)
  8. 결제 실패/타임아웃 시 expired 또는 cancelled로 전이한다.
  9. 동일 사용자+슬롯 조합에 대해 활성 hold 중복 생성은 허용하지 않는다.
  10. hold와 reservation 간 참조 무결성을 유지한다.

3. Product Decision

  1. Hold 단계는 결제 완료 전 임시 점유로 정의한다.
  2. Hold 시간 정책은 기본 90초, 최대 180초를 사용한다.
  3. 결제 재시도는 기본 2회로 운영한다.
  4. prepaid 성공은 예약 확정(reserved)까지를 보장한다.
  5. 최종 완료(redeemed)는 검증 방식(none|location|qr)에 따라 분기한다.
  6. 결제 실패/만료 시 환불 없이 종료 상태로 전이한다.

4. UX Decision

  1. Hold/결제 전이의 UX 단일 SoT는 SPEC-000의 UX Rule Catalog를 따른다.
  2. 본 ADR은 도메인 전이 정책만 정의하고, 화면 단계/CTA/문구 상세는 UX-R-001/002/003/004/005를 참조한다.
  3. 시나리오 기반 UX 변경은 SCENARIO 갱신 후 SPEC-000 Rule ID 갱신으로 반영한다.

5. Tech Decision

  1. Hold 생성/전환/만료를 트랜잭션 경계로 관리한다.
  2. 결제 결과 확정 시 reserved 전이를 원자적으로 처리한다.
  3. 재시도 요청은 멱등키로 중복 처리한다.
  4. Hold 만료 기본값 90초, 최대값 180초, 재시도 2회를 기본 설정으로 사용한다.

6. Ops Decision

  1. Hold 만료 배치를 주기적으로 실행한다.
  2. 배치 실패 시 재실행 절차를 표준화한다.
  3. 스케줄 변경은 운영 이력으로 관리한다.
  4. 기본 배치 주기는 1분이며, 변경 시 공지/이력 기록을 남긴다.

7. Implementation Contract (Optional)

7.1 API Contract

  • Hold 생성 응답은 hold_id, expires_at_utc, retry_remaining을 반환한다.
  • 결제 확정/실패 콜백은 idempotency_key로 중복 처리한다.
  • 결제 성공 응답은 최소 reservation_status=reserved, next_required_step(none|location|qr)를 포함한다.

7.2 Data Contract

  • 동일 user_id + slot_id의 활성 hold 중복 생성은 금지한다.
  • Hold TTL은 90~180초 범위로만 저장한다.
  • 결제 성공 시 reserved_at_utc를 필수 기록한다.

7.3 Error/Observability Contract

  • HOLD_ALREADY_EXISTS, HOLD_EXPIRED, PAYMENT_CONFIRM_TIMEOUT 코드를 표준화한다.
  • Hold 생성/만료/결제확정/예약확정 이벤트를 감사로그에 필수 기록한다.

7.4 Test/Acceptance Contract

  • prepaid+none은 결제 성공 직후 reserved -> redeemed가 즉시 수행되어야 한다.
  • prepaid+qr/prepaid+location은 결제 성공 시점에는 reserved를 유지해야 한다.
  • 결제 실패/타임아웃 시 expired|cancelled로만 종료되어야 한다.
  • UX 수용 기준 검증은 SPEC-000UX-R-001/002/003/004/005 준수 여부로 판정한다.

8. Validation

  • Domain/Product/UX/Tech/Ops 결정이 충돌하지 않는다.
  • 구현 기준은 SPEC과 정합성을 유지한다.
  • 운영 절차는 RUNBOOK으로 연결된다.