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

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.0.0")
    implementation("androidx.fragment:fragment-ktx:1.5.5")
}

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단계: FragmentContainerViewQuestionnaireFragment 추가

QuestionnaireFragment을(를) 렌더링하려면 JSON 인코딩된 FHIR 설문지가 필요합니다. 설문지는 크기가 작으므로(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")

if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(
      R.id.fragment_container_view,
      QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
    )
  }
}

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

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. Cloud Storage에서 FHIR 리소스 추출 QuestionnaireResponse

시작 프로젝트에 포함된 설문지는 간단한 환자 등록 흐름을 위한 것이므로 궁극적으로 설문지 응답을 사용하여 이를 기반으로 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()에는 이전 설문지 JSON 문자열을 파싱하여 만들 수 있는 HAPI FHIR 설문지와 앞서 가져온 QuestionnaireResponse가 필요합니다. 추출된 리소스(이 경우 단일 환자 리소스)가 포함된 HAPI FHIR 트랜잭션 Bundle을 반환합니다.

앱을 다시 실행하여 최신 변경사항으로 다시 빌드합니다. 앱이 실행되면 정보를 입력하고 제출을 탭합니다. 이제 로그에 추출된 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 앱에 구조화된 데이터 캡처 라이브러리 적용

자세히 알아보기