어플 개발을 하면서 room db 를 이용해 로그인 토큰을 저장하거나 유저의 간단한 정보를 저장하곤 했었다. 잘 사용하던 와중 room db 에 추가하고 싶은 컬럼이 생겨서 room db의 컬럼을 새로 추가하고 어플을 빌드해보니 몇가지 오류를 발견할 수 있었다.
안드로이드에서 room db 를 이용해서 로컬 db 에 정보를 저장하다가 저장하고 싶은 정보가 바뀌거나 새로 추가될 경우, 즉 데이터베이스의 스키마가 변경되는 경우 기기 내의 room db 를 이전시켜야 한다. 그 과정을 Room Migration 이라고 부른다.
Room Migration 에는 두 가지 방법이 있다.
먼저 자동 이전이다,
버전 간의 자동 이전을 선언하려면 @Database 의 autoMigrations 속성에 @AutoMigration 주석을 추가해야 한다.
// Database class before the version update.
@Database(
version = 1,
entities = [User::class]
)
abstract class AppDatabase : RoomDatabase() {
...
}
// Database class after the version update.
@Database(
version = 2,
entities = [User::class],
autoMigrations = [
AutoMigration (from = 1, to = 2)
]
)
abstract class AppDatabase : RoomDatabase() {
...
}
다음은 수동 이전이다.
복잡한 스키마 변경이 포함된 이전이라면 Migration 클래스를 구현하여 수동으로 이전 경로를 정의해야 한다. 수동 이전과 자동 이전이 함께 사용될 경우 수동이전이 적용된다고 한다.
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, `name` TEXT, " +
"PRIMARY KEY(`id`))")
}
}
val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE Book ADD COLUMN pub_year INTEGER")
}
}
Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3).build()
이전 경로를 찾지 못하는 경우가 발생할 수 있을 것이다. 이 경우 IllegalStateExcetion 예외가 발생할 수 있다. 기존의 데이터를 삭제해도 괜찮은 상태라면, fallbackToDestructiveMigration( ) 빌더 메서드를 호출하면 된다.
공식 문서에 자세한 설명이 잘 나와 있으니 부족한 부분은 참고하면 좋을 것이다.
Room 데이터베이스 이전 | Android 개발자 | Android Developers
Room 라이브러리를 사용하여 데이터베이스를 안전하게 이전하는 방법 알아보기
developer.android.com
'Android 공부' 카테고리의 다른 글
30. Navigation Component (0) | 2023.09.03 |
---|---|
29. JVM 구조 (0) | 2023.08.11 |
26. 안드로이드 Bundle & Parcelable (0) | 2023.02.16 |
25. 안드로이드 의존성 주입 (Dependency Injection) (0) | 2023.02.13 |
24. 가비지 컬렉션 ( Garbage Collection) (0) | 2023.02.10 |