IT

[Healthcare/IT/표준] FHIR로 시작하는 헬스케어 표준 살펴보기

BoBooBoo 2018. 5. 30. 13:00
반응형
* 공부하면서 알게 된 내용과 실제 몇몇 경험을 바탕으로 쓴 내용으로 오류가 있을 수 있습니다.
* 처음 접하는 사람에게 어떻게 설명해줄 수 있을까.. 하는 관점에서 쓴 글입니다.
* 작성일: 2018-05-30

FHIR(Fast Healthcare Interoperability Resources)


FHIR라고 쓰고 Fire 처럼 읽는다. (http://wiki.hl7.org/index.php?title=FHIR)


FHIR를 접하게 된건 3년 정도 됬고 구현도 해봤지만 과연 내가 알고 쓰는건가.. 하는 의문이 들어서 공부겸, 정리겸 적어보려고 한다.

용어 그 자체로 볼 때 FHIR는


Fast (상대적으로) 빠르고
Healthcare
헬스케어 영역에서 사용하는
Interoperability
상호운용성을 가진, 즉 표준의 역할을 하는데,
Resources
리소스라는 개념으로 구현하는 것

이라는 의미다.


하나씩 살펴보면,



Fast

아니 정확히는 (Relative) Fast로 보는 것이 맞겠다.

FHIR는 HL7(Health Level 7)이라는 기관에서 주도하는 기술인데, FHIR는 먼저 만들어진 CDA (Clinical Document Architecture), HL7 V2 Message, RIM (Reference Information Mode) 과 같은 표준들보다 빠르다(라고 보는 것이 맞다). 그러니 CDA, V2, V3가 뭔지 모르면... 비교 대상이 없으니 빠른지 알수도 없다.

여기서 (상대적으로) 빠르다를 (상대적으로) 쉽다로 생각하는 것도 나쁘지 않은 것 같다.

그래서 어떤 면이 빠른가하면,


1. 이해하기 쉽다(특히 개발자들이) = 빠르게 이해할 수 있다.

2. 쉽게 개발할 수 있다. = 빠르게 개발할 수 있다.

3. 읽기 쉽다.
4. 발전이 빠르다.


사실 더 많이 나열할 수도 있을 것 같은데...

이전 것이 너무 구렸기 때문에 부각되는 장점이라고 생각된다.




Healthcare


헬스케어에 쓰는 ...




Interoperability

주로 상호운용성으로 번역한다.


Interoperability를 보장하는 것이 "표준(Standard)"라는 것이 필요한 가장 중요한 이유임에도 불구하고 이 분야를 처음 접하는 사람들이 체감하기 가장 힘든 개념이 아닐까 싶다.


간단히 말하면 '같은 기준(표준)을 보고 개발하자' 하는 이야기다.

예를 들어, 심박수를 측정하고 저장하는 앱을 개발한다고 하자.


- 두 개발자(혹은 개발사) A와 B는 모르는 사이다.
- A는 Android에서, B는 IOS에서 만들고 있다.
- 각각 앱은 측정한 심박수를 '어떤 형태'로 저장한다. (이름, 시간 심박수를 저장한다고 하자.)


A에서 B가 수집한 데이터를 가져와서 활용하고 싶다(=상호운용). 어떻게 해야할까?


먼저 B에게 데이터 포맷을 물어봐야 한다.
A는 B가 어떤 형태로 데이터를 저장하고 있는지 알 방도가 없다. 문서가 정말 잘되어있다면 좋겠지만 아마 그렇지 않을 것이다... 게다가 XML이나 JSON 같은 포맷이면 차라리 다행이다만


김이름#201805292230#70,
김이름#201805302347#60, ...

혹은


김|이름|2018|05|29|22:30|70,
김|이름|2018|05|30|23|47|60, ...

이라면?


예제가 쉬워서 대충봐도 성, 이름, 년월일시간, 심박수 순서인 것 같지만 실제 의료 데이터는 이 정도 수준이 아님을 우리가 자주보는 처방전 표지만 봐도 알 수 있을 것이다.

이제 데이터 포맷(프로토콜이라고도 한다) 문서를 받았으니 A에서 쓸 수 있도록 데이터를 가공해야 한다. 그럴려면 Parsing을 해야는데 귀찮으니 B에게 혹시 Parser 있냐고 물어본다.

없거나, 있어도 안주거나, A의 플랫폼과 다른 언어로 개발되어 있어서 사용하기 힘들 것이다.

꾸역꾸역 B 데이터 Parser를 만들어서 쓰려고 하니 B에서 데이터 포맷이 바뀌었다고 한다ㅡ.ㅡ. 다시 수정하고 A 앱에 반영하고... (경험...)


...


이정도면 대충 무슨 말을 하고자하는지 알 것 같은데, 결론적으로 저 짓(?)을 반복하기전에 A, B 모두 같은 데이터 포맷으로 개발하면 해결된다라는 거다. 이것이 표준이 해주는 일이다.

예를 들면, 환자 정보와 심박수가 포함된 데이터는 아래와 같이 구성하자라고 정해놓을 수 있다.


{
    "이름":김이름", // 문자열
    "측정일":201805292230", // YYYYMMDDhhmm
    "심박수":"60" // 정수
}


그리고 실제로 FHIR는 환자(Patient)를 작성하는 아래와 같이 표현하고 있다. (http://hl7.org/fhir/patient.html)


Resources


바로 위에서 본 Patient가 바로 리소스 중 하나이다.

리소스(Resources)는 FHIR에서 말하는 데이터의 단위인데 행동(Behavior)이나 의미(Meaning) 단위로 나누어진다. 무슨 소린고 하니,

http://hl7.org/fhir/resourcelist.html

현재(2018.05.30 기준) STU3에서 보여주고 있는 리소스들을 보면 위와 같다.

사람이나 기관을 의미할 수 있는 Patient, Practitioner, Organization ,
약과 관련된 내용을 포함하는 Medication,
면역과 관련이 있을 것 같은 Immunization,
지금은 뭔지 모를 Bundle, Binary

다양한 목적을 위해 리소스가 이미 구현되어 있다. 나중에 하나씩 살펴보기로...


이해를 돕기 위해 앞에서 본 심박수 데이터 포맷 예제를 다시 보자.

{
    "이름":김이름", // 문자열
    "측정일":201805292230", // YYYYMMDDhhmm
    "심박수":"60" // 정수
}


사실 이 포맷은 누가봐도 근본없는 그냥 내맘대로 포맷이다.

그럼 FHIR를 적용하려면 어떻게 할 수 있을까?
왠지 이름을 표시하려면 Patient가 필요할 것 같다. 측정일과 측정데이터를 표시하려면 Observation 이라는 리소스가 적당할 것 같다. 그리고 두 데이터가 한번에 전송되어야하니 Bundle 을 이용해서 감싸보자.
대충 fhir+json으로 만들어보면 아래와 같은 형태가 나온다.
{
    "resourceType": "Bundle",
    ...
    {
        "resourceType": "Patient",
        "name":[{
            "family": "김"
            "given": "이름"
            ...
        }]
        ...
    }
    {
        "resourceType": "Observation",
        "valueQuantity": {
            "value": 70
            ...
        }
        ...
    }
}


대략적인 설명을 위해 위와 같은 예를 들었지만 FHIR를 참고했다고 해서 다 표준은 아니다.
FHIR는 상호운용성을 가진 데이터를 구성하기 위해 모듈을 제공하는 일종의 플랫폼이자 라이브러리로 생각하면 개발자가 이해하기 쉽다.

FHIR is a platform specification that defines a set of capabilities use across the healthcare process, in all jurisdictions, and in lots of different context.
- http://hl7.org/fhir/modules.html -

다음엔 리소스나 구현이나 예제분석이나... 중에 하나를 정리해볼 예정이다.

끝.


[참고]
- http://hl7.org/fhir/
- FHIR Release 3 (STU, Standard for Trial Use)




반응형