[android] 안드로이드 Room Database의 데이터베이스 마이그레이션

안드로이드 앱을 개발하다보면 데이터베이스 스키마를 업데이트해야 할 때가 있습니다. 안드로이드에서는 Room 라이브러리를 사용하여 SQLite 데이터베이스를 다룰 수 있는데, 이때 데이터베이스 스키마의 변경이 필요한 경우에는 데이터베이스 마이그레이션을 수행해야 합니다. 이 포스트에서는 안드로이드 Room Database에서 데이터베이스 마이그레이션을 어떻게 수행하는지 알아보겠습니다.

데이터베이스 버전 업그레이드

Room Database에서 데이터베이스의 스키마를 변경하려면 먼저 데이터베이스의 버전을 업그레이드합니다. 버전을 업그레이드하면 Room은 이전 버전과 새 버전 간의 차이를 확인하고 마이그레이션 스크립트를 실행하여 데이터베이스를 업데이트합니다.

데이터베이스 마이그레이션 구현

데이터베이스 마이그레이션을 구현하려면 RoomDatabase.Callback 클래스를 상속받아 onMigrate() 메서드를 오버라이드합니다. 이 메서드에서는 이전 버전과 새 버전 간의 마이그레이션 로직을 작성합니다.

아래는 데이터베이스 마이그레이션을 구현하는 예제 코드입니다.

@Database(entities = {User.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {

    public abstract UserDao userDao();

    private static AppDatabase INSTANCE;

    public static AppDatabase getInstance(final Context context) {
        if (INSTANCE == null) {
            synchronized (AppDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            AppDatabase.class, "app_database")
                            .addMigrations(MIGRATION_1_2)
                            .build();
                }
            }
        }
        return INSTANCE;
    }

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            // 이전 버전과 새 버전 간의 마이그레이션 로직 작성
        }
    };
}

위 코드에서 addMigrations() 메서드를 사용하여 마이그레이션 스크립트를 추가하고, Migration 클래스를 사용하여 이전 버전과 새 버전 간의 마이그레이션 로직을 구현합니다.

마이그레이션 테스트

마이그레이션이 제대로 동작하는지 확인하기 위해 마이그레이션 테스트를 작성해야 합니다. 마이그레이션 테스트를 통해 데이터베이스가 올바르게 업데이트되는지 확인할 수 있습니다.

@RunWith(AndroidJUnit4.class)
public class MigrationTest {

    @Rule
    public MigrationTestHelper testHelper;

    public MigrationTest() {
        testHelper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
                AppDatabase.class.getCanonicalName(),
                new FrameworkSQLiteOpenHelperFactory());
    }

    @Test
    public void testMigrate1To2() throws IOException {
        SupportSQLiteDatabase db = testHelper.createDatabase("test-db", 1);
        db.execSQL("CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER, `name` TEXT, PRIMARY KEY(`id`))");
        db.execSQL("INSERT INTO `user` VALUES (1, 'John')");
        db.execSQL("INSERT INTO `user` VALUES (2, 'Jane')");
        db.close();

        // 데이터베이스 버전 2로 마이그레이션
        db = testHelper.runMigrationsAndValidate("test-db", 2, true, AppDatabase.MIGRATION_1_2);
        // 마이그레이션 후 데이터 확인 로직 작성
    }
}

위 코드에서는 MigrationTestHelper를 사용하여 마이그레이션 테스트를 작성하고, runMigrationsAndValidate() 메서드를 통해 마이그레이션 후 데이터가 올바르게 변환되는지 확인합니다.

안드로이드 Room Database의 데이터베이스 마이그레이션을 통해 데이터베이스 스키마를 안전하게 업데이트할 수 있습니다.

참고 자료: