구조화된 데이터 캡처 라이브러리로 건강 데이터 캡처 및 처리

1. 시작하기 전에

빌드할 항목

이 Codelab에서는 구조화된 데이터 캡처 라이브러리를 사용하여 Android 앱을 빌드하는 방법을 알아봅니다. 앱은 구조화된 데이터 캡처 라이브러리를 사용하여 FHIR 설문지와 응답을 렌더링하고 처리합니다.

학습할 내용

  • 구조화된 데이터 캡처 라이브러리를 Android 애플리케이션에 통합하는 방법
  • 설문지 표시 방법
  • QuestionnaireResponse로 답변을 받는 방법
  • QuestionnaireResponse에서 FHIR 리소스를 추출하는 방법

필요한 항목

이 Codelab에서는 구조화된 데이터 캡처 라이브러리에 중점을 둡니다. 따라서 이와 관련 없는 개념과 코드 블록은 그냥 넘어가겠습니다. 단, 필요할 때 복사해서 붙여넣을 수 있도록 다른 설명 없이 제공만 해드리겠습니다. Android 앱을 빌드한 적이 없다면 첫 앱 빌드로 시작하세요.

2. 설정

코드 다운로드

이 Codelab의 코드를 다운로드하려면 Android FHIR SDK 저장소를 클론하세요. git clone https://github.com/google/android-fhir.git

이 Codelab의 시작 프로젝트는 codelabs/datacapture에 있습니다.

Android 스튜디오로 앱 가져오기

먼저 Android 스튜디오로 시작 앱을 가져오겠습니다.

Android 스튜디오를 열고 Import Project (Gradle, Eclipse ADT, etc.)를 선택한 다음 이전에 다운로드한 소스 코드에서 codelabs/datacapture 폴더를 선택합니다.

Android 스튜디오 시작 화면

시작 앱 실행

이제 Android 스튜디오로 프로젝트를 가져왔으므로 앱을 처음으로 실행할 수 있습니다.

USB를 통해 Android 기기를 호스트에 연결하거나 Android 스튜디오 에뮬레이터를 시작하고 Android 스튜디오 툴바에서 실행 (실행 버튼)을 클릭합니다.

Hello World 앱

아직 여기에 많은 내용이 없으므로 앱에 설문지를 표시하는 방법을 바로 알아보겠습니다.

3. 프로젝트에 구조화된 데이터 캡처 라이브러리 추가

구조화된 데이터 캡처 라이브러리의 종속 항목 추가

구조화된 데이터 캡처 라이브러리 종속 항목을 사용하면 앱에 구조화된 데이터 캡처 라이브러리를 통합할 수 있습니다. 프로젝트의 app/build.gradle.kts 파일 끝에 다음 줄을 추가합니다.

dependencies {
    // ...

    implementation("com.google.android.fhir:data-capture:1.2.0")
    implementation("androidx.fragment:fragment-ktx:1.6.0")
}

프로젝트를 Gradle 파일과 동기화

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 이 시점에서 프로젝트를 Gradle 파일과 동기화해야 합니다.

Android 스튜디오 툴바에서 Sync Project with Gradle Files (Gradle 동기화 버튼)를 선택합니다. 앱을 다시 실행하여 종속 항목이 올바르게 작동하는지 확인할 수도 있습니다.

4. 설문지 표시

이 단계에서는 FragmentContainerView에 설문지를 렌더링하는 기능을 스타터 앱에 추가합니다.

이 과정에서 Android 스튜디오는 필요한 가져오기를 추가하라는 메시지를 표시합니다.

  • androidx.core.os.bundleOf
  • androidx.fragment.app.add
  • androidx.fragment.app.commit
  • android.util.Log
  • com.google.android.fhir.datacapture.QuestionnaireFragment

1단계: FragmentContainerView 추가

애플리케이션의 레이아웃에 FragmentContainerView를 추가합니다. 여기에 나중에 만들 QuestionnaireFragment이 표시됩니다.

  1. activity_main.xml (res > layout > activity_main.xml)을 엽니다.
  2. Layout Editor의 오른쪽 상단에서 Code, Split, Design 뷰 옵션을 찾습니다.
  3. 코드 보기를 선택합니다. 레이아웃 보기 옵션
  4. TextView가 필요하지 않으므로 삭제합니다. <TextView부터 닫는 />까지 모든 항목을 삭제해야 합니다.
  5. ConstraintLayout 내에 FragmentContainerView를 추가합니다. activity_main.xml 파일은 다음과 같이 표시됩니다.
    <?xml version="1.0" encoding="utf-8" ?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
    >
    
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

2단계: QuestionnaireFragment 구성

QuestionnaireFragment를 렌더링하려면 JSON으로 인코딩된 FHIR Questionnaire이 필요합니다. 설문지는 512KB 미만이므로 프래그먼트를 만드는 데 사용될 인수 BundleString로 포함합니다. 성능상의 이유로 더 큰 설문지는 URI로 제공해야 합니다.

원하는 경우 questionnaire.json 파일을 확인할 수 있지만 구조화된 데이터 캡처 라이브러리의 장점 중 하나는 FHIR 설문지의 구조 (또는 FHIR에 관한 모든 것)를 몰라도 렌더링할 수 있다는 것입니다. Codelab의 뒷부분에서 이 파일을 자세히 살펴봅니다.

빌더를 사용하여 QuestionnaireFragment을 만들고 setter 함수를 사용하여 설문지를 설정합니다. 레이아웃 컨테이너 내에 QuestionnaireFragment를 표시하려면 FragmentManager를 사용하여 FragmentTransaction를 만듭니다.

MainActivity.kt를 열고 MainActivity 클래스에 다음 코드를 추가합니다.

// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")

val questionnaireFragment =
  QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()

3단계: QuestionnaireFragment를 FragmentContainerView에 추가

레이아웃 컨테이너 내에 QuestionnaireFragment를 표시하려면 FragmentManager를 사용하여 FragmentTransaction를 만듭니다. FragmentManager는 이전에 생성된 questionnaireParams를 사용하여 인스턴스화를 처리합니다.

MainActivity 클래스에 다음 코드를 추가합니다.

// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(R.id.fragment_container_view, questionnaireFragment)
  }
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
  QuestionnaireFragment.SUBMIT_REQUEST_KEY,
  this,
) { _, _ ->
  submitQuestionnaire()
}

프래그먼트 사용 방법에 대해 자세히 알아보세요.

Android 스튜디오 툴바에서 실행 (실행 버튼)을 클릭하여 Codelab을 실행해 보겠습니다. 다음과 비슷한 모습이어야 합니다.

에뮬레이터에 렌더링된 설문지

설문지를 탐색하고 답변을 입력해 보세요. 불리언, 텍스트, 날짜 등 다양한 답변 위젯이 사용되며, 이는 원래 FHIR 설문지의 기본 유형에 따라 자동으로 렌더링되었습니다.

기술적으로는 설문지를 렌더링하기 위해 이 작업만 하면 됩니다. 축하합니다!

하지만 사용자가 입력한 답변을 볼 수 없다면 설문조사는 그다지 유용하지 않습니다. 설문지 응답을 받는 다음 단계로 넘어가겠습니다.

5. 설문지 응답 가져오기

이전 단계에서는 앱에서 FHIR 설문지를 렌더링했습니다.

이 섹션에서는 설문지의 답변을 QuestionnaireResponse로 가져옵니다.

submitQuestionnaire() 메서드를 찾아 다음 코드를 추가합니다.

// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
        as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()

// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
    jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)

설문지 응답을 가져오려면 이전에 만든 설문지 프래그먼트를 검색한 다음 getQuestionnaireResponse() 메서드를 사용합니다. 이렇게 하면 직접 또는 Android FHIR SDK의 다른 부분과 함께 사용할 수 있는 HAPI FHIR QuestionnaireResponse가 반환됩니다. 이 Codelab에서는 다른 HAPI FHIR 라이브러리를 사용하여 로그에서 볼 수 있도록 JSON 문자열로 변환합니다.

앱을 다시 실행하여 최신 변경사항으로 다시 빌드합니다. 실행되면 설문지에 정보를 입력하고 제출을 탭합니다. 로그에 QuestionnaireResponse이 JSON으로 포함된 메시지가 표시됩니다.

D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}

6. QuestionnaireResponse에서 FHIR 리소스 추출

시작 프로젝트에 포함된 설문지는 간단한 환자 등록 흐름을 위한 것이므로 궁극적으로 설문지 응답을 기반으로 FHIR 환자 리소스를 만들 수 있습니다. 설문지 응답에서 FHIR 리소스로의 이러한 변환을 데이터 추출이라고 합니다. 구조화된 데이터 캡처 라이브러리의 ResourceMapper 클래스를 사용하면 됩니다.

데이터 추출을 수행하려면 데이터 추출 방법을 포함하도록 설문지를 작성해야 합니다. 다행히 샘플 설문지는 이미 정의 기반 추출을 위해 설정되어 있습니다.

submitQuestionnaire() 메서드를 찾아 다음 코드를 추가합니다.

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

ResourceMapper.extract()에는 HAPI FHIR 설문지가 필요합니다. 이 설문지는 이전의 설문지 JSON 문자열을 파싱하여 만들 수 있습니다. 또한 QuestionnaireResponse도 필요하며 이는 이미 앞에서 가져왔습니다. 하나 이상의 추출된 리소스(이 경우 단일 환자 리소스)가 포함된 HAPI FHIR 트랜잭션 번들을 반환합니다.

앱을 다시 실행하여 최신 변경사항으로 다시 빌드합니다. 실행되면 정보를 입력하고 제출을 탭합니다. 이제 로그에 추출된 FHIR 번들의 JSON 표현이 포함된 extraction result 메시지가 표시됩니다.

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. 축하합니다.

구조화된 데이터 캡처 라이브러리를 사용하여 앱에서 FHIR 설문지와 응답을 처리했습니다.

  • 설문지 표시
  • 설문지 응답 가져오기
  • QuestionnaireResponse에서 FHIR 리소스 추출

이것으로 설정 및 실행이 완료됩니다.

진행하면서 애플리케이션 전체에서 다양한 방식으로 FHIR 리소스를 사용하고 싶을 수 있습니다. Android FHIR SDK의 FHIR 엔진 라이브러리를 확인하여 애플리케이션에서 FHIR 리소스를 로컬로 저장하고 관리하며 원격 FHIR 서버와 데이터를 동기화하는 방법을 알아보세요.

학습한 내용

  • Android 앱에 구조화된 데이터 캡처 라이브러리를 추가하는 방법
  • QuestionnaireFragmentResourceMapper을 사용하여 FHIR 설문조사를 사용하는 방법

다음 단계

  • 구조화된 데이터 캡처 라이브러리 관련 문서 살펴보기
  • 렌더링된 설문지의 디자인 맞춤설정
  • 자체 Android 앱에 구조화된 데이터 캡처 라이브러리 적용

자세히 알아보기