ADR-DS-013_발행 제한 계산 규칙

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 + 1

3. 월 발행 횟수 계산

3.1 계산 기준

  • merchantId 기준

  • calendar month (Asia/Seoul)

  • slot.createdAt 기준

monthlyIssuedCount =
COUNT(slot)
WHERE merchantId = ?
AND createdAt BETWEEN monthStart AND monthEnd

if 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) = today

if activeIssuedCount >= concurrentLimit
→ 발행 거절


4.4 구조적 효과

  • 미래 시간대라도 “오늘”이라면 active 1개를 점유

  • 발행자는 자연스럽게 하루의 핵심 시간 하나만 선택하게 됨


5. 동일 조건 정의 (Reissue Identity)

동일 조건은 아래가 모두 동일할 때 성립한다.

  1. merchantId 동일

  2. startAt 동일

  3. endAt 동일

  4. benefitText 동일

  5. targetScope 동일

부분 중첩은 동일 조건으로 보지 않는다.


6. 재발행 최소 간격

6.1 목적

동일 조건 슬롯을 반복적으로 찍어내는 것을 방지한다.

6.2 계산 기준

lastSameConditionCreatedAt =
MAX(createdAt)
WHERE merchantId = ?
AND sameCondition = true

6.3 최소 간격

플랜최소 재발행 간격
Basic4시간
Pro2시간
Premium1시간

판정:

if (serverNow - lastSameConditionCreatedAt) < reissueInterval
→ 발행 불가

7. 동시 노출과 재발행 간격의 상호작용

여기서 중요한 구조 정합성을 정의한다.

7.1 우선순위

동시 노출 제한이 먼저 적용된다.

즉:

  1. concurrentLimit 검사

  2. 동일 조건 재발행 간격 검사

  3. 월 발행 횟수 검사


7.2 실질적 효과

동시 노출이 1인 경우:

  • active 슬롯이 존재하는 동안은
    → 동일 조건 재발행은 구조적으로 의미가 없음
    → concurrentLimit에서 이미 차단됨

따라서 재발행 간격 규칙은
“동시 노출이 2 이상인 플랜”에서 의미를 가진다.


8. 상시 할인 방지 규칙

8.1 상시 할인 정의

다음이 동시에 성립하면 상시 할인 구조로 간주한다.

  • 동일 조건 슬롯이 7일 이상 반복

  • 하루 70% 이상 시간대 점유

8.2 정책

MVP 단계에서는 자동 차단하지 않는다.
단, 관리자 플래그 및 경고만 기록한다.


9. 불변 조건

  1. 동시 active 슬롯 수 ≤ concurrentLimit

  2. 월 발행 수 ≤ planMonthlyLimit

  3. 동일 조건 재발행은 최소 간격 충족

  4. 당일 외 날짜 슬롯 발행 불가 (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)