도메인 모델 — Health · Check · Detection · Change · Incident¶
이 문서는 KPubData Watch MVP PRD(v1.0 Draft, 2026-09-30)의 §6, §7, §8, §9, §10, §21, §22, §23, §24, §25, §26 를 목적별로 나눈 것이다. 전체 대응표는 문서 안내 에 있다.
Core Product Model¶
PRD §6
KPubData Watch의 가장 중요한 개념은:
이다.
잘못된 모델:
Check 종류가 늘어날수록 UI와 도메인이 무한히 복잡해진다.
따라서 다음 구조를 사용한다.
Dataset
│
├── Health
│
│ ├── Healthy
│ ├── Degraded
│ ├── Critical
│ └── Unknown
│
├── Checks
│
│ ├── Availability
│ ├── Freshness
│ ├── Contract
│ └── Quality
│ ├── Volume
│ └── Completeness
│
├── Changes
│
├── Incidents
│
└── Metrics
Health Model¶
PRD §7
7.1 Dataset Health¶
Public UI에서는 Dataset마다 하나의 Health만 제공한다.
HEALTHY¶
현재 활성화된 Warning/Critical Incident가 없다.
DEGRADED¶
Dataset은 사용할 수 있지만 주의가 필요한 상태다.
예:
CRITICAL¶
사용 불가능하거나 높은 장애 가능성이 있는 상태다.
예:
UNKNOWN¶
정상/비정상을 판단할 수 없다.
예:
매우 중요한 원칙:
Watch가 확인하지 못했다고 Dataset을 장애로 표시하지 않는다.
Check Result Model¶
PRD §8
개별 Check는 다음 상태를 반환한다.
NOT_APPLICABLE은 중요하다.
모든 Dataset에 모든 Check를 강제로 적용하지 않는다.
예:
월간 정적 통계 Dataset
Availability PASS
Freshness PASS
Contract PASS
Quality PASS
갱신 시점을 판단할 방법이 없는 Dataset
Availability PASS
Freshness NOT_APPLICABLE
Contract PASS
Quality PASS
Freshness 는 Registry 의 필드 하나(field: modified_at)가 아니라 추출 종류(kind)로
선언되고, 레코드에서 갱신 시점을 뽑을 수 없는 Dataset 은 freshness.enabled: false
와 사유(reason)를 선언해 NOT_APPLICABLE 이 된다 — 예: 시간 필드가 설립일뿐인
datago.hospital_info (Registry — Freshness 설정).
Health Aggregation¶
PRD §9
Health는 Check 이름 자체가 아니라 활성 Detection/Incident Severity를 기준으로 결정한다.
기본 규칙:
Active CRITICAL incident
↓
CRITICAL
Active WARNING incident
↓
DEGRADED
No active warning/critical
↓
HEALTHY
No reliable observation available
↓
UNKNOWN
INFO 수준의 Change는 Health를 낮추지 않는다.
예:
반면:
Health와 Change의 분리¶
PRD §10
KPubData Watch에서는 반드시 다음을 구분한다.
예:
이면:
반면:
이면:
따라서 내부 흐름은 다음과 같다.
Detection¶
PRD §21
Observation과 Detection은 분리한다.
Detection 예:
{
"dataset_id": "visitkorea-tourism",
"observation_id": "...",
"check": "contract",
"result": "FAIL",
"severity": "CRITICAL",
"type": "field_removed",
"evidence": {
"field": "addr2",
"previous_type": "string"
}
}
Evidence Schema¶
PRD §22
모든 중요한 Detection에는 다음 형태의 Evidence를 저장할 수 있어야 한다.
{
"expected": {},
"observed": {},
"difference": {},
"rule": {},
"first_seen_at": "...",
"confirmed_at": "..."
}
UI는 이 Evidence를 사용해:
를 설명한다.
Change¶
PRD §23
Change는 관측된 사실이다.
예:
Change는 반드시 장애라는 뜻이 아니다.
필드:
Change는 원칙적으로 Immutable Event로 취급한다.
Incident¶
PRD §24
Incident는 사용자가 대응해야 할 가능성이 높은 문제다.
예:
API unavailable
Freshness delayed
Breaking contract change
Severe volume anomaly
Severe completeness anomaly
필드:
id
dataset_id
incident_type
severity
status
started_at
detected_at
confirmed_at
resolved_at
title
summary
evidence
related_change_id
review_result
Incident 는 단일 official_notice_url 필드를 갖지 않는다 — Notice 는 독립
엔티티이고 N:N 링크로 연결된다(ADR 0011).
Notice¶
PRD §55 · ADR 0011 (#35)
공식 공지(점검, 장애, 정정 등)는 독립 엔티티다. 등록·링크는 운영자 CLI 로 한다(자동 수집 없음, D-018).
필드:
Incident 와 Change 에 N:N 으로 링크한다. 링크 레코드:
링크는 정보성이다 — 공지가 Incident 를 설명해도 자동 resolve 하지 않는다. 해소는 Watch 의 관측 근거(ADR 0009)만으로 한다.
Incident Lifecycle¶
PRD §25
운영자 판단:
도 지원한다.
Detection 품질 개선을 위해 Incident에 다음 review를 저장한다.
Incident Severity¶
PRD §26
MVP에서는 세 단계만 사용한다.
예:
| Event | Severity |
|---|---|
| Optional field added | INFO |
| Moderate freshness delay | WARNING |
| Moderate volume anomaly | WARNING |
| Required field removed | CRITICAL |
| Confirmed API outage | CRITICAL |
Dataset-specific override를 허용한다.