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)