본문 바로가기

Android 공부

28. 안드로이드 Room Migration

어플 개발을 하면서 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