ePA Export 데이터 명세
- 상태: 초안
- 최종 갱신: 2026-06-08
- 담당: pibi@weltcorp.com
- 근거 코드: dta-wide-api —
libs/feature/health-data-export(구현 코드 기준) - 작성 근거: BfArM 신고 시트
diga_WELT_verarbeitete_daten-KO.xlsx(Datenstruktur 시트) 및 fbeta 제공 MIO 샘플 — 8. 참고 자료 참조 - 참고: Google Drive 폴더
- 원본: Confluence "ePA Export 데이터 명세서" 를 이관한 문서다.
이 명세에는 코드 구현은 끝났으나 아직 외부 배포/확정 전인 항목이 포함되어 있다.
- Simplifier(welt-sleepq) 배포 대기 2건 — 5. Simplifier 배포 대기 항목
- PU(운영) 전 placeholder 값 2건 (PZN, 소프트웨어 버전) — 6. PU 전 미확정 항목
0. 변경 이력
| 버전 | 날짜 | 변경 요약 | 담당 |
|---|---|---|---|
| v0.1 | 2026-06-04 | 초안 작성 | pibi@weltcorp.com |
| v0.2 | 2026-06-08 | 10. 데이터 보관 및 삭제 정책 추가 (BSI O.Data_5/O.Data_6 매핑 포함) | pibi@weltcorp.com |
1. 개요
이 문서는 WELT Insomnia DiGA 앱에서 ePA(elektronische Patientenakte, 전자환자기록)로 전송되는 데이터의 종류와 형식을 정의한다.
- 전송 형식: FHIR Bundle XML (KBV_PR_MIO_DIGA_Bundle v1.1.0)
- 명시적 제외 항목: 일부 항목은 데이터 최소화 정책에 의해 의도적으로 번들에서 제외된다(각 영역 표의 "미포함" 표기 참조).
2. Bundle 구조 개요
ePA 로 보내는 데이터는 하나의 FHIR Bundle document 로 묶인다. Bundle 내 Composition 은 아래 4개 섹션으로 구성된다.
Bundle (KBV_PR_MIO_DIGA_Bundle v1.1.0)
├─ Fragebögen → WIS 주간 인터뷰 (설문 정의 + 회차별 응답)
├─ Ziele → 수면 목표 (주차별)
├─ Befunde → 수면일지 (일별) + 학습 진도
└─ Beurteilungen → 설문 점수 (PHQ-9 / ISI / DBAS16 / GAD7 / PSS)
Bundle 최상위에는 환자(Patient), 기기(Device, DeviceDefinition), 제조사(Organization) 리소스가 항상 포함된다.
3. 데이터 영역별 명세
3.1 환자 (Patient) — 1건
| 항목 | 타입 | 내용 | 비고 |
|---|---|---|---|
| RI 식별자 | string | 무작위 UUID (매 export 새로 생성) | 환자 직접 식별 불가한 내부 참조 ID |
| KVNR (건강보험번호) | string | eID 인증에서 수신 (예: X123456789) | ePA export 필수. local export 는 생략 가능 |
| 이름 | — | 미포함 | 데이터 최소화 정책 |
| 생년월일 | — | 미포함 | 데이터 최소화 정책 |
| 성별 | — | 미포함 | 데이터 최소화 정책 |
3.2 제조사·기기 (Organization / Device / DeviceDefinition) — 각 1건
| 항목 | 타입 | 내용 | 비고 |
|---|---|---|---|
| 회사명 | string | WELT Corp | |
| 홈페이지 | string | https://www.weltcorp.com/index.html | |
| 주소 | string | 132, Teheran-ro, Seoul, 06235, ROK, 14F | fbeta 04-15 샘플 기준 확정 — 8절 ③ 참조 |
| 기기명 | string | WELT Insomnia | |
| VE-ID | string | de000113331 | 실제 등재 값 |
| PZN | string | placeholder (100001) | ⚠️ 6절 참조 — PU 전 실값 교체 필요 |
| 소프트웨어 버전 (Softwareversion) | string | placeholder (1.0.0) | ⚠️ 6절 참조 — PU 전 실값 교체 필요 |
3.3 설문 (Assessments) — 치료 기간 중 회차별 각 1건
5종 설문의 회차별 총점과 응답 시점을 전송한다. 개별 문항 응답은 미포함 — 총점만 전송(BfArM 신고 기준 일치).
| 항목 (xlsx) | 타입 | FHIR 코드 | 코드 시스템 |
|---|---|---|---|
| 설문 - PHQ-9 | integer | 44261-6 | LOINC 2.81 |
| 설문 - ISI | integer | 762989006 | SNOMED CT 20250201 |
| 설문 - DBAS16 | decimal | 89196-0 | LOINC 2.81 |
| 설문 - GAD7 | integer | 69737-5 | LOINC 2.81 |
| 설문 - PSS | integer | 106875-8 | LOINC 2.81 |
| 설문 응답 시점 | dateTime | — | — |
3.4 수면 목표 (Sleep Goals) — 주차당 3건
| 항목 (xlsx) | 타입 | 단위 | 비고 |
|---|---|---|---|
| 목표 - 소등 시각 (Lights out time) | string | {hh:mm} | |
| 목표 - 기상 시각 (Wake-up time) | string | {hh:mm} | |
| 목표 - 침대에 있는 시간 (Time in bed) | code | h | |
| 목표 유효 기간 | date | — | 주 시작일 ~ 종료일 |
| 목표 달성 | boolean | — | 소등·기상·침대시간 3종 각각 |
3.5 수면 일지 (Sleep Diary) — 일별 각 2건 (QuestionnaireResponse + Observation)
하루 수면 기록 1건당 QuestionnaireResponse(응답 14항목) + Observation(달성 여부·메타) 2개 리소스가 생성된다.
| 항목 (xlsx) | 타입 | 단위 | 비고 |
|---|---|---|---|
| 수면 일지 – 항목 작성 시점 | dateTime | — | |
| 수면 일지 질문 - 환자가 수면을 취했는지 | boolean | — | true 이면 이하 수면 항목 absent 처리 |
| 수면 일지 질문 - 소등 시각 | time | — | |
| 수면 일지 질문 - 기상 시각 | time | — | |
| 수면 일지 질문 - 수면 시간(총) | decimal | h | |
| 수면 일지 질문 - 수면 효율 | decimal | % | |
| 수면 일지 질문 - 입면 잠복기 | decimal | min | |
| 수면 일지 질문 - 입면 후 각성 시간 | decimal | h | |
| 수면 일지 질문 - 수면제 복용 여부 | boolean | — | |
| 수면 일지 질문 - 낮잠 시간 | decimal | min | |
| 수면 일지 질문 - 수면의 질 | code | — | 1~5 단계, LOINC LA 코드 매핑 |
| 수면 일지 질문 - 긍정적 요인 | code | — | 일부 Simplifier 미배포 — 5절 참조 |
| 수면 일지 질문 - 부정적 요인 | code | — | |
| 수면 일지 질문 - 긍정적 요인 자유 입력 | string | — | 사용자 직접 입력 텍스트 |
| 수면 일지 질문 - 부정적 요인 자유 입력 | string | — | 사용자 직접 입력 텍스트 |
| 목표 달성 — 소등 | boolean | — | 목표 소등 시각 달성 여부 (Observation component) |
| 목표 달성 — 기상 | boolean | — | 목표 기상 시각 달성 여부 (Observation component) |
| 목표 달성 — 침대시간 | boolean | — | 소등 + 기상 동시 달성 시 true, 파생값 (Observation component) |
수면 영향 요인 코드 상세
긍정적 요인
| 항목 | 코드 | 코드 시스템 | Simplifier 상태 |
|---|---|---|---|
| 없음 | 260413007 | SNOMED CT | — |
| 야외 운동 (exerciseInFreshAir) | fresh-air-exercise | WELT MIO | 🟡 배포 대기 |
| 좋은 기분 | good-mood | WELT MIO | — |
| 낮 햇빛 | sunlight | WELT MIO | — |
| 이완 운동 | relaxation-exercises | WELT MIO | — |
| 편안한 저녁 루틴 | relaxed-routine | WELT MIO | — |
부정적 요인
| 항목 | 코드 | 코드 시스템 | Simplifier 상태 |
|---|---|---|---|
| 없음 | 260413007 | SNOMED CT | — |
| 스트레스/걱정 | stress-or-worry | WELT MIO | — |
| 장시간 근무 | long-working-hours | WELT MIO | — |
| 저녁 카페인·알코올 | caffeine-or-alcohol | WELT MIO | — |
| 통증·불편 | pain-or-discomfort | WELT MIO | — |
| 수면 방해 환경 | disturbed-sleep-environment | WELT MIO | — |
3.6 WIS (WELT Insomnia Scale) 설문 — 정의 1건 + 회차별 응답
치료 사이클 중 매주 수행하는 WELT Insomnia Scale 설문. FHIR Questionnaire 정의 1건과 회차별 QuestionnaireResponse 로 전송된다.
| 항목 (xlsx) | 타입 | 비고 |
|---|---|---|
| WIS 질문 - 수면제 복용 | string | 선택 + 자유입력 |
| WIS 질문 - 혼자 잠을 자는지 | string | |
| WIS 질문 - 침실 소음 수준 | string | |
| WIS 질문 - 침실 온도 | string | |
| WIS 질문 - 침실 조도 | string | |
| WIS 질문 - 이상적인 취침 시각 | string | |
| WIS 질문 - 이상적인 기상 시각 | string | |
| WIS 질문 - 일과 리듬 | string | |
| WIS 질문 - 피로감 | string |
3.7 학습 진도 — 0~1건
| 항목 (xlsx) | 타입 | 단위 | 비고 |
|---|---|---|---|
| 학습 진도 | decimal | % | 유효 범위(0~100) 밖이면 번들에 미포함 |
4. 코드 체계
| 코드 시스템 | 사용 영역 | 관리 주체 |
|---|---|---|
| LOINC 2.81 | 설문 (PHQ-9, DBAS16, GAD7, PSS), 수면일지 항목, 학습 진도 | 외부 표준 |
| SNOMED CT 20250201 | 설문 (ISI), 수면 영향 요인 "없음" | 외부 표준 |
| WELT MIO CodeSystem | 수면 영향 요인 긍정적/부정적 선택지 | WELT — Simplifier(welt-sleepq) 관리 |
5. Simplifier 배포 대기 항목
아래 항목은 코드 구현은 완료되었으나 Simplifier(welt-sleepq) 공개 배포가 아직 이루어지지 않은 사항이다.
| 항목 | 변경 유형 | 내용 | 현재 상태 |
|---|---|---|---|
긍정적 요인 exerciseInFreshAir | CodeSystem + ValueSet 신규 추가 | 앱 실사용 중(운영 DB 80건+)이나 WELT MIO CodeSystem 에 누락되어 있던 항목. 추가 코드명: fresh-air-exercise. ValueSet XML 및 BfArM 신고 시트에 로컬 반영 완료. — 8절 ④ 수정본 참조 | 🟡 배포 대기 |
| 부정적 요인 라벨 오류 수정 | BfArM 신고 시트 수정 | pain-or-discomfort ↔ disturbed-sleep-environment 라벨-코드 swap 오류 및 철자 오류(enviroment). XML/코드 구현은 이미 정확. 신고 문서만 재제출 필요. — 8절 ④ 수정본 참조 | 🟡 배포 대기 |
6. PU(운영 환경) 전 미확정 항목
현재 placeholder 값으로 구현되어 있으며 실값 교체가 필요하다.
| 항목 | 현재 값 | 필요 조치 |
|---|---|---|
| PZN (의약품 고유번호) | 100001 (placeholder) | BfArM/IFA 등록 후 실값 교체 |
| 소프트웨어 버전 (Softwareversion) | 1.0.0 (placeholder) | DiGA 릴리스 버전 확정 후 교체 |
7. 외부 링크
- Simplifier WELT profile: simplifier.net/welt-sleepq
- KBV DiGA MIO v1.1.0: simplifier.net/dtk
- 구현 코드: dta-wide-mono /
libs/feature/health-data-export - 내부 참고 문서: dta-wide-mono /
docs/references/ePA/
8. 참고 자료 및 첨부 파일
아래 파일들이 이 문서의 작성 근거다. 원본(바이너리)은 Google Drive 에 보관한다.
| # | 파일명 | 설명 | 날짜 | 링크 |
|---|---|---|---|---|
| ① | diga_WELT_verarbeitete_daten-KO.xlsx | BfArM 신고 데이터 구조 시트. 이 문서의 항목명·타입·단위 기준. | — | Drive |
| ② | WELT MIO 샘플 v1 (04/02) | fbeta 제공 첫 번째 MIO 참고 샘플. | 2026-04-02 | Drive |
| ③ | WELT MIO 샘플 v2 (04/15) | fbeta 제공 두 번째 MIO 참고 샘플. Organization 주소가 서울 본사로 갱신됨. 현재 구현의 기준 샘플. | 2026-04-15 | Drive |
| ④ | WELT MIO 수정본 (미배포) | WELT 자체 수정본. fresh-air-exercise 긍정적 요인 추가 + 부정적 요인 라벨 오류 수정 반영. Simplifier 배포 대기 중(5절 참조). | 2026-06-04 | Drive |
| ⑤ | diga_WELT_verarbeitete_daten-KO.xlsx 수정본 | WELT 자체 수정본. fresh-air-exercise 추가 + 라벨 오류 수정 반영. Simplifier 배포 대기 중(5절 참조). | 2026-06-04 | Drive |
9. 출력 예시 (최종 export 형태)
아래는 dev 환경 데이터 기준으로 생성된 실제 export 결과물이다. 데이터 품질은 참고용이며 실제 운영 데이터와 다르다. 운영 환경 구현 후 갱신될 예정이다.
| 형식 | 설명 | 다운로드 |
|---|---|---|
| XML (FHIR Bundle) | local export 실행 결과. FHIR Bundle 전체 구조 및 실제 데이터 형태. | health-export-sample.xml |
| local export 실행 결과. 사용자에게 제공되는 PDF 뷰. | health-export-sample.pdf |
다음은 XML(FHIR Bundle)의 머리 부분 발췌다 — Bundle(MIO 프로파일) + Composition(4개 섹션 중 Fragebögen) 구조를 보여준다. 전체는 위 다운로드 링크 참조.
<Bundle xmlns="http://hl7.org/fhir">
<id value="fbb3fb01-d89b-413c-a0dc-3753fb6dda77"/>
<meta>
<lastUpdated value="2026-06-04T05:17:59.597Z"/>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_MIO_DIGA_Bundle|1.1.0"/>
</meta>
<identifier>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/v2-0203"/>
<code value="RI"/>
<display value="Resource identifier"/>
</coding>
</type>
<system value="urn:ietf:rfc:3986"/>
<value value="urn:uuid:fbb3fb01-d89b-413c-a0dc-3753fb6dda77"/>
</identifier>
<type value="document"/>
<timestamp value="2026-06-04T05:17:59.597Z"/>
<entry>
<resource>
<Composition>
<meta>
<profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_MIO_DIGA_Composition|1.1.0"/>
</meta>
<extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_MIO_DIGA_Betrachtungszeitraum">
<valuePeriod>
<start value="2026-05-28"/>
<end value="2026-06-04"/>
</valuePeriod>
</extension>
<status value="final"/>
<type>
<coding>
<system value="http://loinc.org"/>
<code value="53576-5"/>
<display value="Personal health monitoring report Document"/>
</coding>
</type>
<title value="DiGA-Export"/>
<section>
<title value="Fragebögen"/>
<entry><reference value="Questionnaire/8c153299-..."/></entry>
<entry><reference value="QuestionnaireResponse/daf34fbf-..."/></entry>
</section>
<!-- Ziele / Befunde / Beurteilungen 섹션 생략 -->
</Composition>
</resource>
</entry>
<!-- Patient / Device / DeviceDefinition / Organization / Observation / Goal ... entry 생략 -->
</Bundle>
10. 데이터 보관 및 삭제 정책
local export 산출물(FHIR Bundle XML, PDF)은 사용자 다운로드를 위해 GCS 버킷에 임시 저장된 뒤 lifecycle 규칙으로 자동 삭제된다. 데이터 최소화 정책에 따라 보관 기간을 GCS 최소 단위로 둔다.
10.1 저장 위치
| 항목 | 값 |
|---|---|
| 버킷명 | dta-cloud-de-{env}-health-data-export (env: dev/stage/prod) |
| 리전 | europe-west3 (DiGA EU 데이터 레지던시) |
| 접근 제어 | 비공개, uniform bucket-level access, PII 전용 버킷 |
| IaC | infrastructure/terragrunt/{env}/regions/europe-west3/cloud-storage/health-data-export/terragrunt.hcl |
10.2 삭제 정책 (lifecycle)
- lifecycle rule:
age = 1— 객체 생성 1일 후 자동 삭제(GCS 최소 단위). - 전용 버킷이라 prefix 조건 없이 버킷 전체에 적용.
10.3 lifecycle 실행 지연 (중요)
GCS lifecycle 은 비동기·best-effort 이며 GCP 는 삭제 시각의 정시성을 보장하지 않는다.
- condition 충족 후 보통 24시간 이내 실행되지만, 경우에 따라 더 길어질 수 있다.
- lifecycle 설정 변경도 적용까지 최대 24시간이 걸리며, 규칙 제거 후에도 최대 24시간 동안 동작할 수 있다.
- 실측 사례: 6/2 생성된 객체가 6/5 에 삭제됨(약 3일 지연). 즉
age = 1은 삭제 하한일 뿐, 정확한 삭제 시각은 보장되지 않는다. - 따라서 "특정 시점까지 반드시 삭제"가 규제상 요구된다면 lifecycle 단독으로는 불충분하며, 별도 강제 삭제 로직이 필요하다.
10.4 Soft Delete — 복구 및 삭제 시점 추적
버킷에 GCS 기본 soft delete(보관 7일) 가 적용되어 있다. lifecycle 로 삭제된 객체도 7일간 복구 가능 상태로 보존된다.
-
복구:
gcloud storage restore(hard delete 시각 전까지). -
삭제 시점 추적: 삭제된 객체의
softDeleteTime메타데이터에 실제 삭제 시각이 기록된다.gcloud storage objects list "gs://dta-cloud-de-{env}-health-data-export/**" --soft-deleted \
--project=dta-cloud-de-{env} \
--format="table(name, timeCreated, softDeleteTime, hardDeleteTime)" -
중요: lifecycle 에 의한 삭제는 Cloud Audit Logs 에 기록되지 않는다(수동 API 삭제만 기록). 따라서 soft delete 메타데이터가 삭제 시점을 확인하는 사실상 유일한 수단이다. usage/access 로그(별도 버킷 송출)는 현재 구성되어 있지 않다.
10.5 BSI 규제 대응 (O.Data_5 / O.Data_6)
BSI TR-03161 은 민감 데이터 삭제를 목적 기준(purpose-bound) 으로 규정할 뿐 구체적 삭제 기한(일수)은 명시하지 않는다. 대신 보관 기간을 제조사가 정의·문서화하도록 요구한다(이 §10 이 그 증빙에 해당).
| BSI 항목 | 요구사항 | 본 버킷의 대응 |
|---|---|---|
| O.Data_5 (P.1-072) | 민감 데이터를 처리 기간을 초과하여 보관 금지 | 처리 목적 종료 즉시 삭제 대상 → lifecycle age=1 로 자동 삭제 |
| O.Data_6 (P.1-073) | 데이터 최소화·목적 제한, 데이터별 보관 기간 문서화 | 본 §10 에 위치·목적·보관 기간 명시 (DFD 증빙) |
처리 목적 및 보관 상한 정의 (감사 대비)
| 항목 | 정의 |
|---|---|
| 처리 목적 | local export 산출물(FHIR Bundle XML, PDF)을 사용자 다운로드용으로 일시 제공 |
| 목적 종료 시점 | 사용자 다운로드 완료(또는 미수령 시 생성 후 단기 경과) |
| 보관 상한 | lifecycle age=1 (생성 1일 후 삭제). soft delete 7일은 복구·삭제 추적용이며 처리 목적의 보관이 아님 |