프로젝트: Forage 앱

1. 시작하기 전에

이 Codelab에서는 개발자가 직접 빌드할 Forage라는 새로운 앱을 소개합니다. 이 Codelab에서는 Android 스튜디오 내에서의 프로젝트 설정 및 테스트를 비롯하여 Forage 앱 프로젝트를 완료하는 단계를 안내합니다.

기본 요건

  • 이 프로젝트는 Kotlin으로 배우는 Android 기본사항 과정의 5단원을 완료한 학습자를 대상으로 합니다.

빌드할 항목

  • 항목과 DAO, ViewModel, 데이터베이스 클래스를 구현하여 기존 앱에 Room으로 지속성을 추가합니다.

필요한 항목

  • Android 스튜디오가 설치된 컴퓨터

2. 완성된 앱 개요

완성된 Forage 앱을 사용하면 사용자가 자연에서 찾은 항목(예: 음식)을 추적할 수 있습니다. 이 데이터는 Room을 사용하는 세션 간에 유지됩니다. Room에 관한 지식과 데이터베이스에서의 읽기, 쓰기, 업데이트, 삭제 작업 실행에 관한 지식을 사용하여 Forage 앱에서 지속성을 구현합니다. 완성된 앱과 앱의 기능은 아래에 설명되어 있습니다.

앱을 처음 실행하면 사용자에게는 찾은 항목을 표시하는 recycler 뷰가 포함된 빈 화면이 표시되고 새 항목을 추가하는 플로팅 버튼이 오른쪽 하단에 표시됩니다.

3edd87e63c387d88.png

새 항목을 추가할 때 사용자는 이름과 찾은 위치, 추가 메모를 지정할 수 있습니다. 음식 항목이 현재 제철인지 선택할 수 있는 체크박스도 있습니다.

6c0c739569bb3b4f.png

항목이 추가되면 첫 화면의 recycler 뷰에 표시됩니다.

bcc75e60b70320e8.png

항목을 탭하면 이름과 위치, 메모를 보여주는 세부정보 화면으로 이동합니다.

5096995a4921dcac.png

플로팅 버튼도 더하기 기호에서 수정 아이콘으로 변경됩니다. 이 버튼을 탭하면 이름과 위치, 메모, '제철' 체크박스를 수정할 수 있는 화면으로 이동합니다. 삭제 버튼을 탭하면 데이터베이스에서 항목이 삭제됩니다.

f8c708fed3dede1a.png

이 앱의 UI 부분은 이미 구현되어 있지만 Room에 관한 지식을 바탕으로 지속성을 구현하여 앱이 데이터베이스에서 항목을 읽고 쓰고 업데이트하고 삭제하도록 해야 합니다.

3. 시작하기

프로젝트 코드 다운로드

폴더 이름은 android-basics-kotlin-forage-app입니다. Android 스튜디오에서 프로젝트를 열 때 이 폴더를 선택하세요.

이 Codelab의 코드를 가져와서 Android 스튜디오에서 열려면 다음을 실행합니다.

코드 가져오기

  1. 제공된 URL을 클릭합니다. 브라우저에서 프로젝트의 GitHub 페이지가 열립니다.
  2. 프로젝트의 GitHub 페이지에서 Code 버튼을 클릭하여 대화상자를 엽니다.

5b0a76c50478a73f.png

  1. 대화상자에서 Download ZIP 버튼을 클릭하여 컴퓨터에 프로젝트를 저장합니다. 다운로드가 완료될 때까지 기다립니다.
  2. 컴퓨터에서 파일을 찾습니다(예: Downloads 폴더).
  3. ZIP 파일을 더블클릭하여 압축을 해제합니다. 프로젝트 파일이 포함된 새 폴더가 만들어집니다.

Android 스튜디오에서 프로젝트 열기

  1. Android 스튜디오를 시작합니다.
  2. Welcome to Android Studio 창에서 Open an existing Android Studio project를 클릭합니다.

36cc44fcf0f89a1d.png

참고: Android 스튜디오가 이미 열려 있는 경우 File > New > Import Project 메뉴 옵션을 대신 선택합니다.

21f3eec988dcfbe9.png

  1. Import Project 대화상자에서 압축 해제된 프로젝트 폴더가 있는 위치로 이동합니다(예: Downloads 폴더).
  2. 프로젝트 폴더를 더블클릭합니다.
  3. Android 스튜디오가 프로젝트를 열 때까지 기다립니다.
  4. Run 버튼 11c34fc5e516fb1c.png을 클릭하여 앱을 빌드하고 실행합니다. 예상대로 작동하는지 확인합니다.
  5. Project 도구 창에서 프로젝트 파일을 살펴보고 앱이 설정된 방식을 확인합니다.

4. Room을 사용하도록 프로젝트 설정

Forageable 항목 정의

프로젝트에는 이미 앱의 데이터(model.Forageable.kt)를 정의하는 Forageable 클래스가 있습니다. 이 클래스에 있는 여러 속성은 다음과 같습니다. id, name, address, inSeason, notes

data class Forageable(
   val id: Long = 0,
   val name: String,
   val address: String,
   val inSeason: Boolean,
   val notes: String?
)

그러나 이 클래스를 사용하여 영구 데이터를 저장하려면 Room 항목으로 변환해야 합니다.

  1. "forageable_database" 테이블 이름과 함께 @Entity를 사용하여 클래스에 주석을 답니다.
  2. id 속성을 기본 키로 설정합니다. 기본 키는 자동 생성됩니다.
  3. inSeason 속성의 열 이름을 "in_season"으로 설정합니다.

DAO 구현

ForageableDao(data.ForageableDao.kt)는 개발자가 뷰 모델에서 액세스할 데이터베이스에서 읽고 쓰기 위한 메서드를 정의하는 위치입니다. DAO는 개발자가 정의하는 인터페이스일 뿐이므로 이러한 메서드를 구현하려고 코드를 실제로 작성할 필요는 없습니다. 대신 필요한 경우 SQL 쿼리를 지정하여 Room 주석을 사용해야 합니다.

ForageableDao 인터페이스 내에 메서드 5개를 추가해야 합니다.

  1. 데이터베이스의 모든 행에 Flow<List<Forageable>>을 반환하는 getForageables() 메서드
  2. 지정된 id와 일치하는 Flow<Forageable>을 반환하는 getForageable(id: Long) 메서드
  3. Forageable을 데이터베이스에 삽입하는 insert(forageable: Forageable) 메서드
  4. 기존 Forageable을 매개변수로 사용하고 적절하게 행을 업데이트하는 update(forageable: Forageable) 메서드
  5. Forageable을 매개변수로 사용하여 데이터베이스에서 삭제하는 delete(forageable: Forageable) 메서드

뷰 모델 구현

ForageableViewModel(ui.viewmodel.ForageableViewModel.kt)은 부분적으로 구현되어 있지만 실제로 데이터를 읽고 쓸 수 있도록 DAO 메서드에 액세스하는 기능을 추가해야 합니다. 다음 단계를 따라 ForageableViewModel을 구현하세요.

  1. ForageableDao 인스턴스는 클래스 생성자의 매개변수로 전달해야 합니다.
  2. DAO를 사용하여 전체 Forageable 항목 목록을 가져오고 결과를 LiveData로 변환하는 LiveData<List<Forageable>> 유형의 변수를 만듭니다.
  3. Long 유형의 ID를 매개변수로 사용하고 DAO에서 getForageable() 메서드를 호출하고 결과를 LiveData로 변환하여 LiveData<Forageable>을 반환하는 메서드를 만듭니다.
  4. addForageable() 메서드에서 viewModelScope를 사용하여 코루틴을 실행하고 DAO를 사용하여 Forageable 인스턴스를 데이터베이스에 삽입합니다.
  5. updateForageable() 메서드에서 DAO를 사용하여 Forageable 항목을 업데이트합니다.
  6. deleteForageable() 메서드에서 DAO를 사용하여 Forageable 항목을 업데이트합니다.
  7. ForageableDao 생성자 매개변수로 ForageableViewModel 인스턴스를 생성할 수 있는 ViewModelFactory를 만듭니다.

Database 클래스 구현

ForageDatabase(data.ForageDatabase.kt) 클래스는 실제로 항목과 DAO를 Room에 노출하는 클래스입니다. 설명된 대로 ForageDatabase 클래스를 구현합니다.

  1. 항목: Forageable
  2. 버전: 1
  3. exportSchema: false
  4. ForageDatabase 클래스 내부에 ForageableDao를 반환하는 추상 함수를 포함합니다.
  5. ForageDatabase 클래스 내에서 INSTANCE라는 비공개 변수와 ForageDatabase 싱글톤을 반환하는 getDatabase() 함수를 사용하여 컴패니언 객체를 정의합니다.
  1. BaseApplication 클래스에서 지연 초기화를 사용하여 ForageDatabase 인스턴스를 반환하는 database 속성을 만듭니다.

5. 프래그먼트에서 데이터 유지 및 읽기

항목과 DAO, 뷰 모델을 설정하고 이를 Room에 노출하도록 데이터베이스 클래스를 정의한 후에는 뷰 모델에 액세스하도록 프래그먼트를 수정하면 됩니다. 앱의 각 화면에 하나씩, 파일 세 개를 변경해야 합니다.

Forageable 목록

Forageable 목록 화면에는 두 가지, 즉 뷰 모델 참조와 전체 Forageable 목록 액세스 권한만 필요합니다. ui.ForageableListFragment.kt에서 다음 작업을 실행합니다.

  1. 이 클래스에는 이미 viewModel 속성이 있습니다. 그러나 이전 단계에서 정의한 팩토리는 사용하지 않습니다. 먼저 ForageableViewModelFactory를 사용하도록 이 선언을 리팩터링해야 합니다.
private val viewModel: ForageableViewModel by activityViewModels {
   ForageableViewModelFactory(
       (activity?.application as BaseApplication).database.foragableDao()
   )
}
  1. 그런 다음 onViewCreated()에서 viewModelallForageables 속성을 관찰하고 목록을 채우는 데 적절한 어댑터에서 submitList()를 호출합니다.

Forageable 세부정보 화면

ui/ForageableDetailFragment.kt의 세부정보 목록에도 거의 같은 작업을 실행합니다.

  1. viewModel 속성을 변환하여 ForageableViewModelFactory를 올바르게 초기화합니다.
  2. onViewCreated()의 뷰 모델에서 getForageable()을 호출하고 id를 전달하여 Forageable 항목을 가져옵니다. livedata를 관찰하고 결과를 forageable 속성으로 설정한 후 bindForageable()을 호출하여 UI를 업데이트합니다.

Forageable 화면 추가 및 수정

마지막으로 ui.AddForageableFragment.kt에서도 비슷한 작업을 실행해야 합니다. 이 화면은 항목 업데이트와 삭제도 담당합니다. 그러나 뷰 모델의 이러한 메서드는 이미 올바른 위치에서 호출되고 있습니다. 이 파일에서는 두 가지만 변경하면 됩니다.

  1. ForageableViewModelFactory를 사용하도록 viewModel 속성을 다시 리팩터링합니다.
  2. onViewCreated()에서 삭제 버튼 공개 상태를 설정하기 전에 if 문 블록의 뷰 모델에서 getForageable()을 호출하여 id를 전달하고 결과를 forageable 속성으로 설정합니다.

이것으로 프래그먼트에서 해야 하는 작업을 마쳤습니다. 이제 앱을 실행하면 작동 중인 지속성 기능을 모두 확인할 수 있습니다.

6. 테스트 안내

테스트 실행

테스트를 실행하려면 다음 중 하나를 실행하면 됩니다.

단일 테스트 사례의 경우 테스트 사례 클래스 PersistenceInstrumentationTests.kt를 열고 클래스 선언 왼쪽의 녹색 화살표를 클릭합니다. 그런 다음 메뉴에서 실행 옵션을 선택하면 됩니다. 그러면 테스트 사례의 테스트가 모두 실행됩니다.

3e640ec727599a6d.png

예를 들어 실패한 테스트는 하나뿐이고 나머지 테스트는 통과된 경우와 같이 단일 테스트만 실행하려는 때가 많습니다. 전체 테스트 사례와 마찬가지로 단일 테스트를 실행할 수 있습니다. 녹색 화살표를 사용하여 Run 옵션을 선택합니다.

8647a76419540499.png

테스트 사례가 여러 개라면 전체 테스트 모음을 실행할 수도 있습니다. 앱을 실행하는 것과 마찬가지로 Run 메뉴에서 이 옵션을 찾을 수 있습니다.

7a925c5e196725bb.png

Android 스튜디오는 마지막으로 실행한 타겟(앱, 테스트 타겟 등)을 기본값으로 설정하므로 메뉴에 여전히 Run > Run 'app'이라고 표시되면 Run > Run을 선택하여 테스트 타겟을 실행할 수 있습니다.

90d3ec5ca5928b2a.png

그런 다음 팝업 메뉴에서 테스트 타겟을 선택합니다.

3b1a7d82a55b5f13.png