Room 데이터베이스 마이그레이션

최대환·2024년 2월 14일
0

데이터베이스를 사용하다 보면 스키마, 즉 테이블의 구조가 변경되는 경우가 있습니다. 예를 들어, 새로운 기능을 추가하면서 테이블에 새로운 컬럼을 추가해야 하거나, 더 이상 사용하지 않는 컬럼을 제거해야 할 때가 있죠. 이렇게 데이터베이스의 스키마가 바뀌는 것을 '마이그레이션'이라고 합니다.
Room에서는 크게 세 가지 방법을 제공합니다.

1. fallbackToDestructiveMigration

이 방법은 이름에서 알 수 있듯이, 기존 데이터를 모두 지우고 새로운 스키마로 데이터베이스를 다시 만드는 방법입니다. 이 방법은 간단하게 데이터베이스를 새로운 버전으로 업데이트할 수 있지만, 기존 데이터가 모두 사라진다는 단점이 있습니다.

val db = Room.databaseBuilder(applicationContext, MyDatabase::class.java, "database-name")
    .fallbackToDestructiveMigration()
    .build()

2. addMigrations

이 방법은 개발자가 직접 SQL 쿼리를 작성하여 데이터베이스의 스키마를 업데이트하는 방법입니다. 이 방법을 사용하면 데이터를 유지하면서 테이블의 구조를 바꿀 수 있습니다.

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE old_table ADD COLUMN new_column INTEGER")
    }
}

val db = Room.databaseBuilder(applicationContext, MyDatabase::class.java, "database-name")
    .addMigrations(MIGRATION_1_2)
    .build()

3. autoMigrations

이 방법은 Room 2.4.0-alpha01 버전부터 제공되는 기능으로, Entity 클래스의 변경사항을 자동으로 데이터베이스에 반영해주는 방법입니다. 이 방법을 사용하면 개발자가 직접 SQL 쿼리를 작성하지 않아도 데이터베이스의 스키마를 업데이트할 수 있습니다.
build.gradle

    defaultConfig {
        applicationId = "com.choidaehwan.simpleex"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

		// 이부분을 추가해주시면 됩니다.
        kapt {
            arguments {
                arg("room.schemaLocation", "$projectDir/schemas")
            }
        }
    }
@Database(
    entities = [MyEntity::class],
    version = 2,
    autoMigrations = [
        AutoMigration(from = 1, to = 2)
    ]
)
abstract class MyDatabase : RoomDatabase() { ... }

이렇게 Room에서는 다양한 방법으로 마이그레이션을 지원합니다. 어떤 방법을 사용할지는 앱의 데이터를 어떻게 관리하고 싶은지에 따라 결정하면 됩니다. 데이터를 유지하면서 테이블의 구조를 바꾸려면 'addMigrations'나 'autoMigrations'를 사용하면 됩니다. 반면, 기존 데이터를 지우고 데이터베이스를 새로 만들어도 괜찮다면 'fallbackToDestructiveMigration'을 사용하면 됩니다.

profile
나의 개발지식 output 공간

0개의 댓글