ADR-DS-017

## 1. ?? ??

  • ADR ID: ADR-DS-017
  • ??: Domain Rule
  • ??: Draft
  • ?? ??: 2026-03-02
  • ?? ??: Domain Architecture
  • ?? ADR: ?? ??
  • Supersedes: N/A
  • Superseded By: ADR-DS-012

2. ?? (Context)

? ?? ?? ?? ??/?? ?? ADR ?? ?? v2 ?? ???? ?? ??/?? ?? ?? ??. ?? ??/?? ?? ?? ??/?? ?? ?? ??.


슬롯은 당일 한정이며, 만료시간은 발행자가 발행 시 설정한다

  • 상태: Superseded

  • 작성일: 2026-03-02

  • Superseded By: ADR-DS-012

  • 범위: Slot 날짜 제약, 만료(사용 확정 허용) 시간 설정, Reservation expiresAt 산정 규칙 변경


1. 결정 (Decision)

1.1 슬롯은 “당일 한정”이다

  • Slot.startAt과 Slot.endAt은 동일한 로컬 날짜(서비스 타임존 기준, Asia/Seoul) 안에 있어야 한다.

  • Slot은 “오늘의 시간 기회”이며, 내일/미래 날짜 슬롯 발행은 금지한다.

1.2 만료시간(사용 확정 허용 마감)은 발행자가 설정한다

  • 발행자는 슬롯 발행 시 usageVerifyGraceMinutes(시작 후 사용 확정 허용 분)를 설정한다.

  • 기본값은 15분을 권장한다(대부분의 업종에서 합리적).

1.3 Reservation.expiresAt은 “슬롯 시작 기준”으로 계산한다

  • Reservation.expiresAt은 reservedAt 기반이 아니라, 슬롯 시작시간 기반으로 산정한다.

2. 데이터 모델 추가/변경

Slot 필드 추가

  • usageVerifyGraceMinutes (int)

권장 기본값

  • default = 15

가드레일(초기 권장)

  • 0 <= usageVerifyGraceMinutes <= 30
    (너무 길면 사실상 예약/점유처럼 작동할 수 있어서 상한이 필요함. 필요 시 업종별로 조정 가능)

3. 시간 규칙 (expiresAt 산정)

Reservation 생성 시 서버가 저장하는 expiresAt:

expiresAt = slot.startAt + usageVerifyGraceMinutes minutes

의미:

  • 예약은 “시작 후 usageVerifyGraceMinutes까지 사용 확정할 권리”를 가진다.

  • expiresAt 이후 사용 확정은 불가이며, 예약은 EXPIRED로 확정될 수 있다.


4. 사용 확정 허용 조건 수정

기존 ADR-DS-010/012에서 사용 확정 시간 조건을 아래로 고정한다.

  • 사용 확정 허용: serverNow < expiresAt

  • 만료 확정: serverNow >= expiresAt

(동시에 성립하는 모순을 피하기 위해, 사용 확정은 strict(<), 만료는 >=)


5. UX/운영 의미 고정

이 구조에서는 예약(RESERVED)이 “재고를 확정 보장”하지 않는다.
재고 확정은 REDEEMED에서만 발생한다(ADR-DS-011 유지).

따라서 다음 문구/정책이 필요하다(UX 요구사항):

  • “확보는 도착 시점에 확정됩니다.”

  • “사용 확정 시 수량이 소진되어 있으면 확정이 거절될 수 있습니다.”

이건 예상 가능한 결과이며, 구조적으로 허용한다.


6. 검증 규칙 (Validation)

슬롯 발행 시 서버는 다음을 검증한다.

  • startAt과 endAt이 같은 날짜(Asia/Seoul)인지

  • startAt < endAt

  • usageVerifyGraceMinutes가 허용 범위 내인지

  • (선택) expiresAt = startAt + grace가 endAt을 넘지 않도록 제한할지

    • 권장: startAt + grace <= endAt 를 기본으로 강제
      (슬롯 시간 범위를 넘는 사용 확정 허용은 혼란을 만들 수 있음)

7. 기존 ADR 업데이트 안내

이 결정으로 다음 문서는 수정된다.

  • ADR-DS-012: “reservedAt + 15분” 모델 제거, “startAt + grace” 모델로 변경

  • ADR-DS-010: 사용 확정 허용 조건/만료 경계(now==expiresAt) 표현 정리

  • ADR-DS-064: 수량 점유/복구 규칙은 상태 기반 계산을 따른다


8. 필수 테스트 케이스

  • T1: 19:00~20:00, grace=15 → expiresAt=19:15, 19:14 사용 확정 성공 가능, 19:15 사용 확정 실패

  • T2: 점심(12:00)에 19:00 슬롯 예약 생성 가능, 만료는 19:15 기준으로만 판정

  • T3: grace=0 → 시작 시각 직후 만료(19:00에 즉시 마감), 사용 확정은 18:59까지 가능(정책상 < expiresAt)

  • T4: startAt+grace > endAt 인 경우 발행 거절(또는 자동 클램프 중 하나를 정책으로 선택)


빠진 한 줄(중요)

너가 말한 “발행자가 한번에 하나의 슬롯만 열 수 있다”는 통제는 **발행 제한(ADR-DS-013)**에 붙여서 별도 규칙으로 정의하는 게 좋아.
(동시 노출 슬롯 수를 1로 강제하는 옵션은 꽤 강력한 구조 보호 장치임)

원하면 다음으로 **ADR-DS-013에 “동시 노출=1 옵션(업종/플랜별)”**까지 깔끔하게 편입해서 업데이트 버전을 써줄게.



Template v2 Addendum

In Scope

  • Core domain rules (state/time/quantity/penalty/integrity/retention)

Out of Scope

  • Payment settlement, PG integration, UI behavior

Boundaries

  • Domain ADR defines policy. Implementation details belong to Tech ADR and code.

Source of Truth (SoT)

  • State model: ADR-DS-010; Time/expiry: ADR-DS-012; Quantity/concurrency: ADR-DS-064.

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)