**FHIR에서 수면 데이터(Sleep Data) 표현 방법**
FHIR은 수면 데이터를 직접 저장하기 위한 전용 리소스가 없지만, **Observation** 리소스를 중심으로 표준화된 방식으로 표현합니다. 특히 웨어러블(Apple Watch, Oura, Fitbit 등)이나 수면다원검사(PSG) 결과, 수면 일지 등을 다룰 때 널리 사용됩니다.
### 1. 주요 리소스 및 접근 방식
| 리소스 | 용도 | 비고 |
|---------------------|-------------------------------------------|------|
| **Observation** | 수면 지속시간, 수면 단계, 수면 효율, AHI 등 | 가장 핵심. LOINC/SNOMED 코드 사용 |
| **Device** | 데이터 출처 기기 (웨어러블, PSG 장비) | manufacturer, model 등 기록 |
| **Procedure** | 수면다원검사(Polysomnography) 수행 | Clinical sleep study |
| **DiagnosticReport**| 수면 검사 보고서 전체 | 여러 Observation을 묶음 |
| **Patient** / **Encounter** | 환자 및 검사 맥락 | 필수 |
### 2. 주요 표준 코드 (LOINC + SNOMED)
#### 수면 지속시간 관련 (LOINC)
- **93832-4**: Sleep duration (총 수면 시간)
- **93831-6**: Deep sleep duration (깊은 수면 시간)
- **93830-8**: Light sleep duration (얕은 수면 시간)
- **93829-0**: REM sleep duration (REM 수면 시간)
#### 수면 단계 (Sleep Stage)
- **SNOMED CT**:
- `248220008` — Asleep (finding)
- `248218005` — Awake (finding)
- `60984000` — Non-rapid eye movement sleep
- `89129007` — Rapid eye movement sleep (REM)
#### 기타 유용한 코드
- Polysomnography study: **LOINC 28633-6**
- Apnea-Hypopnea Index (AHI): 별도 LOINC 코드 사용 (예: 59460-6 계열 또는 custom)
- Sleep efficiency, Sleep latency 등은 추가 Observation으로 표현
### 3. 실제 구현 패턴
#### 패턴 1: 전체 수면 에피소드 (가장 일반적)
하나의 **Observation**으로 수면 세션 전체를 표현하고, `component`로 단계별 상세를 넣는 방식이 추천됩니다.
```json
{
"resourceType": "Observation",
"meta": {
"profile": ["http://hl7.org/fhir/uv/phr/StructureDefinition/pcd-sleep-observation"]
},
"status": "final",
"category": [{
"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-sign"}]
}],
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "93832-4",
"display": "Sleep duration"
}]
},
"subject": {"reference": "Patient/123"},
"effectivePeriod": {
"start": "2026-06-28T23:15:00+09:00",
"end": "2026-06-29T07:30:00+09:00"
},
"valueQuantity": {
"value": 7.5,
"unit": "h",
"system": "http://unitsofmeasure.org",
"code": "h"
},
"component": [
{
"code": {"coding": [{"system": "http://loinc.org", "code": "93831-6", "display": "Deep sleep duration"}]},
"valueQuantity": {"value": 2.1, "unit": "h"}
},
{
"code": {"coding": [{"system": "http://loinc.org", "code": "93829-0", "display": "REM sleep duration"}]},
"valueQuantity": {"value": 1.8, "unit": "h"}
}
],
"device": {"reference": "Device/oura-ring-001"}
}
```
#### 패턴 2: 수면 단계별 별도 Observation
각 단계(Awake, Light, Deep, REM)를 별도의 Observation으로 기록 (시간대별 상세 분석에 유리).
#### 패턴 3: 임상 수면 검사 (PSG)
- **Procedure** 리소스로 검사 자체를 기록 (`code` = LOINC 28633-6)
- 결과는 여러 **Observation** + **DiagnosticReport**으로 구성
### 4. 관련 Implementation Guide (IG)
- **HL7 FHIR Personal Health Records (PHR) IG** (가장 관련성 높음)
- `PCD Sleep Observation` 프로파일
- `PGHD Sleep Episode Profile`
- LOINC + SNOMED 조합으로 수면 데이터를 표준화
- **US Core** 또는 **KR Core** 기반으로 확장 가능
- 웨어러블 데이터 연동 시 **Device** + **Observation** 조합이 표준
### 5. 실무 팁
| 상황 | 추천 방식 | 비고 |
|-------------------------|----------------------------------------|------|
| 웨어러블 (Oura, Fitbit, Apple Watch) | Observation + Device + LOINC 코드 | 가장 흔한 패턴 |
| 수면다원검사(PSG) 결과 | Procedure + DiagnosticReport + Observation | Clinical |
| 수면 단계 상세 분석 | component 사용 또는 별도 Observation | 시간대별 가능 |
| 대용량 원시 데이터 (EEG 등) | DocumentReference로 링크 | FHIR에 직접 넣지 않음 |
| 한국 시스템 연동 | LOINC + SNOMED 필수 사용 + KR Core 확장 | 상호운용성 확보 |
### 요약
- **기본**: `Observation` + LOINC 코드 (93832-4 등)
- **단계 표현**: SNOMED CT 코드 또는 component
- **출처 기기**: `Device` 리소스 연계
- **표준 IG**: Personal Health Records IG의 Sleep 관련 프로파일 활용 권장
특정 상황(예: Oura 데이터 매핑, PSG 보고서 전체 구조, AHI/산소포화도 포함 등)에 맞춰 더 구체적인 JSON 예시나 프로파일을 만들어 드릴 수 있습니다. 어떤 형태의 수면 데이터를 주로 다루시는지 알려주세요!