본문 바로가기
카테고리 없음

플러터에서 Moor를 통한 데이터베이스 마이그레이션

by Maccrey Coding 2024. 11. 9.
반응형

 

Moor 패키지는 Flutter에서 로컬 데이터베이스 작업을 쉽게 할 수 있게 도와주는 SQLite 기반 라이브러리입니다.

이 중 데이터베이스 마이그레이션은 앱의 버전 변경 시, 데이터베이스 구조를 변경하고 이전 데이터를 새로운 구조에 맞게 업데이트하는 중요한 과정입니다.

Moor에서는 자동 마이그레이션커스텀 마이그레이션을 지원하여 데이터베이스 변경을 안전하게 관리할 수 있습니다.

1. Moor 데이터베이스 마이그레이션 개요

데이터베이스 마이그레이션은 스키마 변경이나 테이블 추가/삭제와 같은 구조 변경이 필요할 때 사용됩니다.

예를 들어, 새로운 컬럼을 추가하거나 테이블을 수정하는 경우에 데이터베이스를 마이그레이션해야 합니다.

Moor에서는 이를 관리하기 위해 스키마 버전 관리마이그레이션 방법을 제공합니다.

2. 데이터베이스 마이그레이션을 위한 설정

스키마 버전 관리

Moor에서는 schemaVersion 속성을 사용하여 데이터베이스의 버전을 관리합니다.

이 버전은 데이터베이스 스키마 변경 시마다 증가시키며, 앱을 실행할 때마다 현재 버전과 이전 버전을 비교하여 필요한 마이그레이션을 수행합니다.

@UseMoor(tables: [Users])
class AppDatabase extends _$AppDatabase {
  AppDatabase(QueryExecutor e) : super(e);

  @override
  int get schemaVersion => 2;  // 데이터베이스 버전
}

AppDatabase 클래스에서 schemaVersion을 정의하여 현재 데이터베이스의 버전을 지정합니다.

이 값을 변경하면 Moor는 버전 차이를 감지하고 필요한 마이그레이션을 실행합니다.

마이그레이션 방식

Moor에서는 자동 마이그레이션커스텀 마이그레이션 두 가지 방법을 제공합니다.

3. 자동 마이그레이션

MOOR의 자동 마이그레이션은 데이터베이스 구조를 변경할 때마다 schemaVersion 값을 올리면 MOOR이 자동으로 스키마 변경을 처리합니다.

이 방법은 데이터베이스의 변경 내용이 간단한 경우에 유용합니다.

예를 들어, 테이블에 새로운 컬럼을 추가하는 경우입니다.

자동 마이그레이션 예시

1. 첫 번째 버전 (schemaVersion = 1)에서 다음과 같은 테이블을 정의했다고 가정해 봅시다.

@DataClassName('User')
class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  IntColumn get age => integer()();
}

 

2. 두 번째 버전 (schemaVersion = 2)에서 email 컬럼을 추가했다고 가정합니다.

@DataClassName('User')
class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  IntColumn get age => integer()();
  TextColumn get email => text().nullable()();  // 새로운 컬럼 추가
}

이렇게 Users 테이블에 컬럼을 추가하면, schemaVersion을 2로 업데이트해야 합니다.

@UseMoor(tables: [Users])
class AppDatabase extends _$AppDatabase {
  AppDatabase(QueryExecutor e) : super(e);

  @override
  int get schemaVersion => 2;  // 버전 2로 변경
}

Moor은 버전 1에서 2로 업그레이드될 때 자동으로 email 컬럼을 추가합니다.

4. 커스텀 마이그레이션

자동 마이그레이션은 간단한 스키마 변경에 유용하지만, 테이블 삭제, 컬럼 삭제와 같은 복잡한 변경이 필요한 경우, 또는 데이터 변환이 필요한 경우에는 커스텀 마이그레이션을 사용해야 합니다.

커스텀 마이그레이션 예시

예를 들어, Users 테이블에서 age 컬럼을 삭제하고, 대신 birthDate라는 DateTime 컬럼을 추가한다고 가정해봅시다.

1. 첫 번째 버전 (schemaVersion = 1)에서는 age 컬럼이 있습니다.

@DataClassName('User')
class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  IntColumn get age => integer()();  // 기존 age 컬럼
}

 

2. 두 번째 버전 (schemaVersion = 2)에서는 age 컬럼을 삭제하고 birthDate 컬럼을 추가합니다.

@DataClassName('User')
class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
  DateTimeColumn get birthDate => dateTime()();  // 새로운 birthDate 컬럼
}

 

3. MOOR은 age 컬럼 삭제와 birthDate 컬럼 추가를 자동으로 처리할 수 없습니다. 그래서 커스텀 마이그레이션을 정의해야 합니다.

@UseMoor(tables: [Users])
class AppDatabase extends _$AppDatabase {
  AppDatabase(QueryExecutor e) : super(e);

  @override
  int get schemaVersion => 2;  // 버전 2로 변경

  @override
  MigrationStrategy get migration => MigrationStrategy(
    onCreate: (Migrator m) async {
      // 첫 번째 버전에서 두 번째 버전으로 마이그레이션할 때 실행할 쿼리
      await m.createTable(users);
    },
    onUpgrade: (Migrator m, int from, int to) async {
      // 테이블 구조를 바꾸기 위한 쿼리 작성
      if (from == 1 && to == 2) {
        // `age` 컬럼을 삭제하고 `birthDate` 컬럼을 추가
        await m.addColumn(users, users.birthDate);  // birthDate 추가
        await m.removeColumn(users, users.age);  // age 삭제
      }
    },
  );
}

주요 사항

  • onCreate: 데이터베이스가 처음 생성될 때 실행되는 코드입니다. 주로 테이블 생성 쿼리를 실행합니다.
  • onUpgrade: 데이터베이스 버전이 업그레이드될 때 실행되는 코드입니다. 버전 차이에 맞는 마이그레이션을 처리합니다.

위 예제에서는 age 컬럼을 삭제하고, birthDate 컬럼을 추가하는 마이그레이션을 onUpgrade에서 처리하고 있습니다.

이를 통해 커스텀 쿼리를 사용해 데이터베이스 구조를 변경할 수 있습니다.

5. 마이그레이션 전략 요약

자동 마이그레이션

  • 간단한 컬럼 추가/수정/삭제에 적합
  • schemaVersion만 증가시키고, 컬럼 추가 등의 작업을 자동으로 처리

커스텀 마이그레이션

  • 복잡한 변경(예: 테이블 삭제, 복잡한 데이터 변환)이 필요할 때 사용
  • onUpgrade와 onCreate를 사용하여 SQL 쿼리를 직접 작성하여 데이터베이스 구조 변경을 처리

6. 마이그레이션 적용 시 주의사항

  1. 버전 관리: 앱이 업그레이드될 때마다 schemaVersion 값을 올리고, 필요한 마이그레이션 작업을 정의해야 합니다.
  2. 데이터 손실 방지: 컬럼을 삭제하거나 이름을 변경할 때 기존 데이터를 잃지 않도록 주의해야 합니다.
  3. 테스트: 마이그레이션을 적용하기 전에 항상 테스트 환경에서 데이터베이스 마이그레이션을 충분히 테스트해야 합니다.

Moor에서 데이터베이스 마이그레이션은 schemaVersion과 MigrationStrategy를 통해 쉽게 관리할 수 있습니다.

간단한 변경은 자동 마이그레이션으로 처리하고, 복잡한 데이터 변환이나 구조 변경이 필요한 경우에는 커스텀 마이그레이션을 정의하여 데이터베이스의 안전한 업그레이드를 할 수 있습니다.

데이터베이스 버전 관리와 마이그레이션 작업을 잘 관리하면, 앱의 업데이트와 유지보수가 훨씬 수월해질 것입니다.

 

구독!! 공감과 댓글,

광고 클릭은 저에게 큰 힘이 됩니다.

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

반응형