[flutter] 플러터(sqflite)와의 데이터베이스 압축 처리 방법

플러터에서 sqflite를 사용하여 애플리케이션의 데이터베이스 관리를 하고 있다면, 데이터베이스 용량이 계속해서 커지는 문제에 직면할 수 있습니다. 이 글에서는 sqflite 데이터베이스를 압축하는 방법에 대해 알아보겠습니다.

1. 데이터베이스 압축의 필요성

일반적으로, sqflite 데이터베이스의 크기가 계속해서 증가하는 경우, 디스크 공간을 낭비하거나 응용 프로그램의 성능에 악영향을 미칠 수 있습니다. 또한 네트워크를 통해 데이터를 전송하거나 백업을 만들 때도 크기가 작은 데이터베이스를 유지하는 것이 중요합니다.

2. 데이터베이스 압축 처리 방법

sqflite 데이터베이스를 압축하는 과정은 다음과 같습니다.

2.1 데이터베이스 백업

가장 먼저, 데이터베이스를 백업해야 합니다. 이를 통해 기존 데이터베이스의 원본을 보존할 수 있습니다.

Future<File> backupDatabase(String dbName) async {
  Directory documentsDirectory = await getApplicationDocumentsDirectory();
  String path = join(documentsDirectory.path, dbName);
  File originalDb = File(path);

  String now = DateFormat("yyyy-MM-dd-HH:mm:ss").format(DateTime.now());
  String backupDbName = 'backup_$now.db';
  String backupPath = join(documentsDirectory.path, backupDbName);

  await originalDb.copy(backupPath);
  return File(backupPath);
}

2.2 임시 데이터베이스 생성

그 다음, 임시 데이터베이스를 생성하고 기존 데이터베이스의 데이터를 새로운 임시 데이터베이스로 이동합니다.

Future<void> compactDatabase(String dbName) async {
  Directory documentsDirectory = await getApplicationDocumentsDirectory();
  String originalPath = join(documentsDirectory.path, dbName);
  String tempDbPath = join(documentsDirectory.path, 'temp_$dbName');

  Database originalDb = await openDatabase(originalPath);
  Database tempDb = await openDatabase(tempDbPath,
      version: await originalDb.getVersion(), onCreate: (db, version) async {});

  await originalDb.transaction((txn) async {
    await txn.execute('ATTACH DATABASE ? AS tempDb', [tempDbPath]);
    await txn.execute('INSERT INTO tempDb.main SELECT * FROM main.myTable');
    await txn.execute('DETACH DATABASE tempDb');
  });

  await originalDb.close();
  await tempDb.close();

  await deleteDatabase(originalPath);
  await File(tempDbPath).rename(originalPath);
}

2.3 압축 완료

위 과정을 거쳐 새로운 데이터베이스에 기존 데이터를 복사하고 나면, 원본 데이터베이스는 삭제하고 새로운 데이터베이스를 원래의 이름으로 리네임하여 압축 과정을 완료합니다.

3. 마치며

애플리케이션의 데이터베이스 크기를 효과적으로 관리하기 위해서는 정기적으로 데이터베이스를 압축하는 작업이 필요합니다. 데이터베이스를 백업하고 임시 데이터베이스로 이동시켜서 압축하는 과정을 정확히 이해하고 구현하여, 애플리케이션의 성능과 저장 공간을 최적화할 수 있습니다.

참고문헌: