[flutter] 플러터에서의 데이터베이스 마이그레이션 및 동기화 방법

플러터(Flutter) 앱 개발 중에 데이터베이스 업데이트나 스키마 변경이 필요한 경우가 있습니다. 이러한 경우에 데이터베이스 마이그레이션과 동기화를 통해 데이터의 무결성을 유지할 수 있습니다. 이번 글에서는 플러터에서 데이터베이스 마이그레이션과 동기화를 어떻게 수행할 수 있는지 알아보겠습니다.

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

데이터베이스 마이그레이션이란 데이터베이스 스키마의 버전을 업데이트하는 과정을 말합니다. 이는 플러터에서 사용되는 SQFlite 라이브러리를 활용하여 수행할 수 있습니다. 다음은 데이터베이스 마이그레이션을 수행하는 예시 코드입니다.

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

final String dbName = 'my_database.db';
final int dbVersion = 2;

// 데이터베이스 마이그레이션 함수
void _migrate(Database db, int oldVersion, int newVersion) async {
    if (oldVersion < 2) {
        // 버전 1에서 2로 업데이트 시 실행할 쿼리문
        String query = 'ALTER TABLE my_table ADD COLUMN new_column INTEGER';
        await db.execute(query);
    }
}

// 데이터베이스 열기 및 마이그레이션 수행
void openDatabaseWithMigration() async {
    String databasesPath = await getDatabasesPath();
    String path = join(databasesPath, dbName);
    
    Database database = await openDatabase(
        path,
        version: dbVersion,
        onCreate: (db, version) {},
        onUpgrade: _migrate,
    );
}

위 코드에서 _migrate 함수는 데이터베이스의 버전을 확인하고 업데이트해야 하는 경우 해당 작업을 수행합니다. openDatabaseWithMigration 함수에서는 데이터베이스를 열 때 onUpgrade 콜백을 지정하여 마이그레이션 함수를 실행하게 됩니다.

데이터베이스 동기화

데이터베이스 동기화는 서버에서 데이터를 가져와 로컬 데이터베이스와 동기화하는 과정입니다. 이를 위해 서버로부터 데이터를 가져오고, 로컬 데이터베이스와 비교하여 변경된 사항을 업데이트하는 작업이 필요합니다. 다음은 데이터베이스 동기화를 수행하는 예시 코드입니다.

import 'package:sqflite/sqflite.dart';

// 데이터베이스 동기화 함수
void syncDatabase() async {
    Database database = await openDatabase('my_database.db');
    
    // 서버로부터 데이터 가져오기
    List<Map<String, dynamic>> serverData = await fetchFromServer();
    
    // 로컬 데이터 가져오기
    List<Map<String, dynamic>> localData = await database.query('my_table');
    
    // 데이터 비교하여 업데이트
    for (var item in serverData) {
        bool isExist = localData.any((element) => element['id'] == item['id']);
        if (!isExist) {
            await database.insert('my_table', item);
        }
    }
    
    for (var item in localData) {
        bool isExist = serverData.any((element) => element['id'] == item['id']);
        if (!isExist) {
            await database.delete('my_table', where: 'id = ?', whereArgs: [item['id']]);
        }
    }
}

위 코드에서 syncDatabase 함수는 서버로부터 데이터를 가져오고, 로컬 데이터베이스와 비교하여 추가 및 삭제 작업을 수행합니다. 이를 위해 SQFlite 라이브러리의 insertdelete 함수를 사용합니다.

결론

플러터에서 데이터베이스 마이그레이션과 동기화는 SQFlite 라이브러리를 활용하여 간단하게 수행할 수 있습니다. 데이터베이스 마이그레이션을 통해 업데이트된 스키마로 데이터의 무결성을 유지하고, 데이터베이스 동기화를 통해 서버와 로컬 데이터베이스를 싱크시킬 수 있습니다.

참고: SQFlite 라이브러리 문서