[flutter] 플러터 Riverpod와 데이터베이스 마이그레이션 방법

플러터를 사용하여 앱을 개발할 때, 데이터베이스를 사용하는 경우 가끔 데이터베이스 스키마를 업데이트해야 할 수 있습니다. 이런 경우에 데이터베이스 마이그레이션을 수행해야 합니다. 이번 글에서는 플러터의 상태 관리 라이브러리인 Riverpod와 함께 데이터베이스 마이그레이션을 하기 위한 방법에 대해 알아보겠습니다.

Riverpod 소개

Riverpod는 플러터의 상태 관리를 위한 라이브러리로써, Provider 패턴을 기반으로 동작합니다. Provider를 사용하여 앱 전역에서 상태를 관리하고, 상태 변경 시 알림을 받을 수 있습니다. 이를 통해 효율적이고 관리하기 쉬운 앱을 개발할 수 있습니다.

데이터베이스 마이그레이션을 위한 패키지

플러터에서 데이터베이스를 사용하기 위해서는 sqflite 패키지를 설치해야 합니다. sqflite는 플러터에서 SQLite 데이터베이스에 접근할 수 있도록 도와주는 라이브러리입니다.

dependencies:
  sqflite: ^2.0.0

데이터베이스 마이그레이션 방법

  1. 먼저, 데이터베이스에 대한 스키마를 정의합니다. 스키마는 데이터베이스 테이블, 컬럼 등을 정의하는 역할을 합니다.
final myTable = <String, List<String>>{
  '1.0': ['CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)']
  '2.0': ['ALTER TABLE items ADD COLUMN price INTEGER']
};
  1. onCreate 콜백에서 데이터베이스를 생성하고 테이블을 생성합니다. 마이그레이션 버전을 정의하여 현재 버전과 비교합니다.
void onCreate(Database db, int version) async {
  await db.execute('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT)');
}

void onUpgrade(Database db, int oldVersion, int newVersion) async {
  for (int version = oldVersion + 1; version <= newVersion; version++) {
    switch (version) {
      case 2:
        await db.execute('ALTER TABLE items ADD COLUMN price INTEGER');
        break;
    }
  }
}

final database = await openDatabase(
  path,
  version: 2,
  onCreate: onCreate,
  onUpgrade: onUpgrade,
);

onCreate 콜백에서는 최초 데이터베이스 생성 시에 테이블을 생성하는 로직을 작성하고, onUpgrade 콜백에서는 마이그레이션을 수행하는 로직을 작성합니다. openDatabase 함수의 version을 통해 현재 데이터베이스 버전을 지정해줍니다.

  1. Riverpod를 사용하여 데이터베이스를 관리합니다. 데이터베이스 인스턴스를 Provider로 만들어서 다른 위젯에서 사용할 수 있도록 합니다.
final databaseProvider = Provider((ref) => database);
  1. 위젯에서 데이터베이스 인스턴스를 사용하기 위해 Riverpod의 ref.read 함수를 사용하여 데이터베이스에 접근합니다.
final database = ref.read(databaseProvider);

상태 관리 라이브러리인 Riverpod와 데이터베이스 마이그레이션을 함께 활용하면, 플러터 앱에서 데이터베이스의 스키마 변경 등의 작업을 효율적으로 관리할 수 있습니다.

참고 자료

간단한 예시 코드를 제공했으니, 필요에 따라 수정하거나 확장해서 사용해보세요. 플러터와 Riverpod를 함께 사용하면 데이터베이스 마이그레이션을 손쉽게 처리할 수 있습니다.