1. 시작하기 전에
빌드할 항목
이 Codelab에서는 구조화된 데이터 캡처 라이브러리를 사용하여 Android 앱을 빌드하는 방법을 알아봅니다. 앱은 구조화된 데이터 캡처 라이브러리를 사용하여 FHIR 설문조사 및 응답을 렌더링하고 처리합니다.
학습할 내용
- 구조화된 데이터 캡처 라이브러리를 Android 애플리케이션에 통합하는 방법
- 설문지 표시 방법
QuestionnaireResponse
로 답변을 받는 방법QuestionnaireResponse
에서 FHIR 리소스를 추출하는 방법
필요한 항목
- 최신 버전의 Android 스튜디오 (v4.1.2 이상)
- Android Emulator 또는 실제 Android 기기
- 샘플 코드
- Kotlin 기반 Android 개발에 관한 기본 지식
이 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 스튜디오로 가져왔으므로 앱을 처음으로 실행할 수 있습니다.
USB를 통해 Android 기기를 호스트에 연결하거나 Android 스튜디오 에뮬레이터를 시작하고 Android 스튜디오 툴바에서 Run (실행) 을 클릭합니다.
아직 내용이 많지 않으므로 앱에 설문조사를 표시해 보겠습니다.
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
가 여기에 표시됩니다.
activity_main.xml
(res > layout > activity_main.xml)을 엽니다.- Layout Editor의 오른쪽 상단에서 Code, Split, Design 뷰 옵션을 찾습니다.
- Code 뷰를 선택합니다.
TextView
는 필요하지 않으므로 삭제합니다.<TextView
부터 닫는/>
까지 모든 항목을 삭제해야 합니다.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 설문조사가 필요합니다. 설문조사가 작으므로(512KB 미만) 프래그먼트를 만드는 데 사용되는 인수의 Bundle
에 String
로 포함합니다. 더 큰 설문조사는 성능상의 이유로 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단계: FragmentContainerView에 QuestionnaireFragment 추가
레이아웃 컨테이너 내에 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 스튜디오 툴바에서 Run (실행, )을 클릭하여 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
도 필요합니다. 이 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 앱에 구조화된 데이터 캡처 라이브러리를 추가하는 방법
QuestionnaireFragment
및ResourceMapper
를 사용하여 FHIR 설문조사를 사용하는 방법
다음 단계
- 구조화된 데이터 캡처 라이브러리 문서 살펴보기
- 렌더링된 설문지의 디자인 맞춤설정
- 자체 Android 앱에 구조화된 데이터 캡처 라이브러리 적용