ADR-DS-061_결제 진행 중 슬롯 임시 확보 정책

ADR-DS-061_결제 진행 중 슬롯 임시 확보 정책

1. 기본 정보

Conforms to: ADR-DS-000 v1 Effective from: ADR-DS-060+ If conflict: ADR-DS-000 wins. Deprecated terms in this scope: arrived, checkin/check_in.

  • ADR ID: ADR-DS-061
  • 제목: 결제 진행 중 슬롯 임시 확보 정책
  • 상태: Accepted
  • 작성일: 2026-03-07
  • 작성자: YSY
  • 관련 ADR: ADR-DS-060 (선결제 기능 도입)

2. 배경 (Context)

플랫폼은 선결제 기반 슬롯 기능을 도입하였다.

선결제 구조에서는 다음 흐름이 발생한다.

슬롯 선택
→ 결제 진행
→ 결제 완료
→ 슬롯 사용

그러나 결제는 일반적으로 10~40초 정도의 시간이 소요된다.

이 시간 동안 다음 문제가 발생할 수 있다.

문제 1 — 동시 확보 경쟁

슬롯 수량이 제한된 경우 여러 사용자가 동시에 슬롯을 선택할 수 있다.

예:

슬롯 수량 = 1

동시에

사용자 A → 결제 시작
사용자 B → 결제 시작

두 사용자 모두 결제를 시도할 수 있다.

이 경우 시스템에 따라 슬롯이 중복 판매되는 문제가 발생할 수 있다.


문제 2 — 결제 진행 중 슬롯 점유

사용자가 결제 화면에서 다음 행동을 할 수 있다.

결제 취소
앱 종료
브라우저 종료
네트워크 오류

이 경우 슬롯이 계속 점유 상태로 남아 다른 사용자가 접근할 수 없는 상태가 발생한다.


문제 3 — 결제 시간과 슬롯 수량 불일치

결제 진행 동안 슬롯이 잠기지 않으면 다음 문제가 발생한다.

결제 성공
하지만 슬롯 수량 초과

이는 플랫폼 신뢰성에 치명적인 오류가 된다.


따라서 결제 진행 중 슬롯을 임시 확보하는 정책이 필요하다.


3. 결정 (Decision)

플랫폼은 결제 시작 시 **슬롯을 임시 확보(reserved 상태)**로 전환한다.

3.1 상태 전이

선결제 슬롯의 기본 상태 모델은 다음과 같다.

issued
→ reserved
→ paid
→ redeemed

예외 상태

reserved → expired
reserved → payment_failed
paid → no_show

3.2 결제 시작 시 동작

사용자가 선결제 슬롯을 선택하면 다음 과정이 수행된다.

슬롯 선택
→ reservation 생성
→ 상태 reserved
→ 결제 시작

reserved 상태에서는 슬롯 수량이 차감된 것으로 간주한다.


3.3 임시 확보 시간 (TTL)

reserved 상태는 일정 시간 동안만 유지된다.

기본 정책

reserved TTL = 3분

이 시간 안에 결제가 완료되지 않으면 슬롯은 자동 해제된다.


3.4 만료 처리

TTL이 초과되면 다음 처리가 수행된다.

reserved → expired

이때 슬롯 수량은 다시 사용 가능 상태로 복구된다.


3.5 결제 성공 처리

PG 결제가 성공하면 다음 상태 전이가 발생한다.

reserved → paid

paid 상태에서는 슬롯이 확정되며 매장 준비가 시작될 수 있다.


3.6 결제 실패 처리

결제 실패 또는 사용자 취소 시

reserved → payment_failed

슬롯 수량은 즉시 복구된다.


4. 수량 관리 정책

본 ADR은 결제 시작 시 임시 확보(reserved 전환) 규칙만 정의한다.

수량 계산의 정식 규칙(점유 상태 집합, capacity_consuming_count, 트랜잭션 조건)은 ADR-DS-064를 단일 원천(SoT)으로 따른다.


5. 결과 (Consequences)

긍정적 영향

  • 동시 결제 충돌 방지
  • 슬롯 중복 판매 방지
  • 결제 진행 중 슬롯 보호
  • 결제 UX 안정성 확보

제한 사항

  • reserved 상태 관리 로직 필요
  • 만료 처리 배치 작업 필요
  • 결제 실패 처리 로직 필요

6. 구조적 의미

본 정책은 슬롯 시스템의 동시성 안정성 확보를 위한 핵심 구조이다.

슬롯 시스템은 다음 원칙을 따른다.

슬롯은 제한된 자원이다
결제는 시간이 걸린다
결제 중 자원은 보호되어야 한다

따라서

결제 시작은 슬롯 확보를 의미한다.

이 정책은 선결제 슬롯뿐 아니라 향후 예약형 서비스 확장에도 동일하게 적용될 수 있다.



Template v2 Addendum

In Scope

  • Prepaid slot operations (reservation, payment confirmation, pickup, quantity, PG connection)

Out of Scope

  • Order brokering, settlement handling, refund amount calculation

Boundaries

  • Payment responsibility is on publisher. Time/state management is on platform.

Source of Truth (SoT)

  • Base: ADR-DS-060; Temporary hold: ADR-DS-061; Payment verification/reconcile: ADR-DS-062; Pickup ops: ADR-DS-063; Quantity/concurrency: ADR-DS-064; PG registration/secret handling: ADR-DS-065.

Validation

  • Detect state/constraint violations via tests and batch checks.
  • Recovery and reprocessing must be idempotent.

Revisit Conditions

  • KPI threshold breach (reservation failure, expiry ratio, payment confirmation failure)
  • External dependency change (PG, regulation, location API)

DS-000 v1 정합성 개정 (2026-03-08)

이 문서는 ADR-DS-000 v1에 정합되도록 다음 규칙을 우선 적용한다.

  1. Reservation 상태 집합은 reserved | redeemed | expired | cancelled만 사용한다.
  2. paid, payment_failed, no_show는 Reservation 상태로 사용하지 않는다.
  3. 결제 중 임시 점유는 Reservation 상태가 아니라 hold 도메인으로 분리한다.
  4. 수량 차감은 reserved -> redeemed 전이 트랜잭션에서만 수행한다.
  5. prepaid + verification_method=none은 결제 성공 시 즉시 redeemed 전이를 허용할 수 있다.
  6. prepaid + (location|qr)는 결제 성공 후 검증 성공 시 redeemed로 전이한다.
  7. 만료 시각은 운영 상한을 강제한다: expires_at <= store_close_at.

본 섹션과 기존 본문이 충돌하면 본 섹션(DS-000 정합성 개정)이 우선한다.