ADR-DS-013_발행 제한 계산 규칙
1. ?? ??
- ADR ID: ADR-DS-013
- ??: 발행 제한 계산 규칙
- ??: Draft
- ?? ??: 2026-03-02
- ?? ??: Domain Architecture
- ?? ADR: ?? ??
- Supersedes: N/A
- Superseded By: N/A
2. ?? (Context)
? ?? ?? ?? ?? ?? ?? ADR ?? ?? v2 ?? ???? ?? ?? ?? ?? ??. ?? ?? ?? ?? ?? ?? ?? ?? ??.
상태: Draft
작성일: 2026-03-02
범위: 월 발행 횟수, 동일 조건 정의, 재발행 최소 간격, 동시 노출 제한, 상호작용 정합성
1. 목적
이 문서는 다음을 수학적으로 고정한다.
발행 1회의 정의
월 발행 횟수 계산
동일 조건의 정의
재발행 최소 간격
동시 노출 슬롯 수 제한
두 규칙(재발행/동시노출)의 상호작용
이 규칙의 목적은 과금이 아니라 시간 구조의 질서 유지다.
2. 발행 단위 정의
2.1 발행 1회의 정의
슬롯 1개 생성 = 1회 발행
수량(totalQuantity)은 발행 횟수에 영향을 주지 않는다.
INSERT slot → monthlyIssuedCount + 13. 월 발행 횟수 계산
3.1 계산 기준
merchantId 기준
calendar month (Asia/Seoul)
slot.createdAt 기준
monthlyIssuedCount =
COUNT(slot)
WHERE merchantId = ?
AND createdAt BETWEEN monthStart AND monthEndif monthlyIssuedCount >= planMonthlyLimit
→ 신규 발행 불가
4. 동시 노출 제한 (Concurrent Active Slots)
이 규칙이 핵심이다.
4.1 활성 슬롯(active slot)의 정의
slot.status = issued
AND date(slot.startAt) = today
AND serverNow < (slot.startAt + slot.usageVerifyGraceMinutes)즉,
당일 슬롯만 존재
startAt + grace 이후는 더 이상 active가 아님
4.2 기본 정책
DEFAULT_CONCURRENT_ACTIVE_SLOTS = 1기본값은 1이다.
의미:
발행자는 한 번에 하나의 시간대만 운영
시간 플랫폼 구조 유지
남발 방지
4.3 판정 규칙
슬롯 생성 시:
activeIssuedCount =
COUNT(slot)
WHERE merchantId = ?
AND slot.status = issued
AND serverNow < (slot.startAt + slot.usageVerifyGraceMinutes)
AND date(slot.startAt) = todayif activeIssuedCount >= concurrentLimit
→ 발행 거절
4.4 구조적 효과
미래 시간대라도 “오늘”이라면 active 1개를 점유
발행자는 자연스럽게 하루의 핵심 시간 하나만 선택하게 됨
5. 동일 조건 정의 (Reissue Identity)
동일 조건은 아래가 모두 동일할 때 성립한다.
merchantId 동일
startAt 동일
endAt 동일
benefitText 동일
targetScope 동일
부분 중첩은 동일 조건으로 보지 않는다.
6. 재발행 최소 간격
6.1 목적
동일 조건 슬롯을 반복적으로 찍어내는 것을 방지한다.
6.2 계산 기준
lastSameConditionCreatedAt =
MAX(createdAt)
WHERE merchantId = ?
AND sameCondition = true6.3 최소 간격
| 플랜 | 최소 재발행 간격 |
|---|---|
| Basic | 4시간 |
| Pro | 2시간 |
| Premium | 1시간 |
판정:
if (serverNow - lastSameConditionCreatedAt) < reissueInterval
→ 발행 불가7. 동시 노출과 재발행 간격의 상호작용
여기서 중요한 구조 정합성을 정의한다.
7.1 우선순위
동시 노출 제한이 먼저 적용된다.
즉:
concurrentLimit 검사
동일 조건 재발행 간격 검사
월 발행 횟수 검사
7.2 실질적 효과
동시 노출이 1인 경우:
- active 슬롯이 존재하는 동안은
→ 동일 조건 재발행은 구조적으로 의미가 없음
→ concurrentLimit에서 이미 차단됨
따라서 재발행 간격 규칙은
“동시 노출이 2 이상인 플랜”에서 의미를 가진다.
8. 상시 할인 방지 규칙
8.1 상시 할인 정의
다음이 동시에 성립하면 상시 할인 구조로 간주한다.
동일 조건 슬롯이 7일 이상 반복
하루 70% 이상 시간대 점유
8.2 정책
MVP 단계에서는 자동 차단하지 않는다.
단, 관리자 플래그 및 경고만 기록한다.
9. 불변 조건
동시 active 슬롯 수 ≤ concurrentLimit
월 발행 수 ≤ planMonthlyLimit
동일 조건 재발행은 최소 간격 충족
당일 외 날짜 슬롯 발행 불가 (ADR-DS-017)
10. 테스트 시나리오
T1
concurrentLimit=1
19:00 슬롯 active
18:00 슬롯 발행 시도
→ 거절
T2
concurrentLimit=1
19:00 슬롯 grace 종료 후
→ 신규 발행 허용
T3
concurrentLimit=2
동일 조건 1시간 내 재발행(Basic)
→ 재발행 간격 위반으로 거절
T4
- 월 20회 초과
→ 발행 거절
11. 구조적 결론
동시 노출 제한은 구조 보호의 1차 방어선
재발행 최소 간격은 2차 방어선
월 발행 제한은 밀도 제어 수단
이 세 가지는 함께 작동해야 한다.
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)