2020년 5월 5일 화요일

Android Room을 사용하여 DB에 데이터 저장

일반적으로 android에서 app을 만들 때 DB 사용은 필요함.

기존에는 SQLite를 사용하여 data class를 읽고 쓰고 할 수 있는 Generic DB access hander 같은 것을 만들었는데 이제는 Android에서 이를 지원한다.

Android Jetpack에서 Room이 여기에 해당되며
SQL의 Abstraction layer로서 쉽게 DB를 사용 가능하도록 해준다.
단 코드 기반 Room class 생성으로 로직 수정 시 빌드가 필요하다.

Room 개요

https://developer.android.com/training/data-storage/room


프로젝트 설정

https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies

주의해야 할 것이 있는데 kotlin을 사용한다면 kapt를 사용해야 하고 kotlin-kapt 플러그인을 추가해야 함. 종속성 예시 아래에 별표로 알려주고 있는데 이를 미처 보지 못해서 실행 중 죽는 현상이 발생하여 원인 찾느라 고생함.

build.gradle의 상단에
apply plugin: 'kotlin-kapt'

를 명시하고 dependencies예제를 추가하되 annotationProcessor 대신 kapt를 사용함.

 def room_version = "2.2.3"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor

kotlin에서 수정없이 사용하면 아래 에러 발생됨.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: X.X.X, PID: 13160
    java.lang.RuntimeException: cannot find implementation for X.X.X.MyDatabase. MyDatabase_Impl does not exist
        at androidx.room.Room.getGeneratedImplementation(Room.java:94)
        at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952)


구현

Room을 사용하여 로컬 데이터베이스에 데이터 저장
https://developer.android.com/training/data-storage/room
를 따라하면 쉽게 구현할 수 있음.

주요 annotation은
@Entity - DB에 저장할 data class/object
@Dao - DB를 사용 시 필요한 interface 정의
@Database - DB class, DB class 인스턴스화 시 DB가 생성되므로 아래 가이드 처럼 Singleton pattern class로 만들어야 함.

참고: 앱이 단일 프로세스에서 실행되는 경우 AppDatabase 개체를 인스턴스화할 때 싱글톤 디자인 패턴을 따라야 합니다. 각 RoomDatabase 인스턴스는 리소스를 상당히 많이 소비하며 단일 프로세스 내에서 여러 인스턴스에 액세스할 필요가 거의 없습니다.

비동기 호출

Room 사용 시 DB transaction이 꽤 시간이 소요 되므로
UI thread에서 직접 호출할 수 없어 비동기적 방법을 사용해야 함.
기존 Android에서는 AsyncTask 같은 것을 사용했었지만 Coroutine을 사용할 수 있음.

https://kotlinlang.org/docs/reference/coroutines-overview.html
https://developer.android.com/topic/libraries/architecture/coroutines


아래 article도 참고할 만함.
https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5



댓글 없음:

댓글 쓰기