안드로이드 앱을 개발하다보면 데이터베이스 스키마를 업데이트해야 할 때가 있습니다. 안드로이드에서는 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의 데이터베이스 마이그레이션을 통해 데이터베이스 스키마를 안전하게 업데이트할 수 있습니다.
참고 자료: