기존에는 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
댓글 없음:
댓글 쓰기