방구석 컴퓨터/플러터

SQLite 스키마 변경을 위한 버전 정보와 `onUpgrade`

CCEO 2025. 1. 9. 15:23
반응형

SQLite를 통해 테이블을 생성할 때 아래와 같은 코드를 사용하게 된다.

  /// 데이터베이스 초기화 메서드
  /// 데이터베이스 경로를 생성하고 열거나 새로 만듬
  Future<Database> _initDB(String dbName) async {
    final dbPath = await getDatabasesPath(); // 데이터베이스 파일을 저장할 기본 경로 불러오기
    final path = join(dbPath, dbName); // 경로와 파일명을 결합하여 완전한 경로 생성

    // SQLite 데이터베이스 열기 또는 생성. 경로가 없으면 파일 생성
    return await openDatabase(
      path,
      version: 1, // 데이터베이스 버전. 변경 시 onUpgrade 콜백 호출
      onCreate: _createDB, // 데이터베이스 최초 생성 시 호출되는 콜백 함수
    );
  }

 

이 때 version 정보를 같이 넣게 되는데,

이것은 앱을 업데이트하면서 스키마가 변경되었지만 기존에 생성된 DB 파일을 유지하면서 새로운 스키마를 적용할 때 그 구분을 위해 설정한다.

 

 

1. 데이터베이스 스키마 관리:

  • 데이터베이스가 처음 생성될 때는 onCreate가 호출되어 초기 테이블 구조를 만듭니다.
  • 이후 앱 업데이트로 데이터베이스 스키마가 변경되면, 기존 데이터를 유지하면서 새 구조를 적용하기 위해 버전을 비교합니다.

2. onUpgrade 호출:

  • 데이터베이스 파일이 이미 존재하지만, 현재 설정된 버전(version)이 기존 데이터베이스의 버전보다 높은 경우, onUpgrade 콜백 함수가 호출됩니다.
  • onUpgrade에서 변경 사항(예: 새로운 테이블 추가, 컬럼 추가 등)을 적용할 수 있습니다.

 

 

동작 프로세스는 아래와 같습니다.

1. 데이터베이스 파일이 없을 경우:

  • onCreate가 호출되어 데이터베이스와 테이블을 새로 생성합니다.
  • 지정된 version으로 데이터베이스가 초기화됩니다.

2. 데이터베이스 파일이 있지만 버전이 다른 경우:

  • 새 버전이 기존 데이터베이스 버전보다 크면 onUpgrade가 호출됩니다.
  • onUpgrade에서 스키마 변경 작업을 수행합니다.

3. 데이터베이스 파일이 있고 버전이 동일한 경우:

  • 아무 작업도 하지 않고 기존 데이터베이스를 그대로 사용합니다.

예제 코드

데이터베이스 초기화 코드

Future<Database> _initDB(String filePath) async {
  final dbPath = await getDatabasesPath(); // 데이터베이스 파일 경로 가져오기
  final path = join(dbPath, filePath); // 파일 경로 설정

  return await openDatabase(
    path,
    version: 2, // 새 버전 설정
    onCreate: _createDB, // 데이터베이스 생성 시 호출
    onUpgrade: _upgradeDB, // 버전이 변경되었을 때 호출
  );
}

 

`onUpgrade` 구현

Future<void> _upgradeDB(Database db, int oldVersion, int newVersion) async {
  if (oldVersion < newVersion) {
    // 기존 테이블에 새로운 컬럼 추가
    if (oldVersion == 1) {
      await db.execute('ALTER TABLE drinks ADD COLUMN description TEXT');
    }
    // 버전 2에서 3으로 업그레이드 작업 추가 가능
    if (oldVersion == 2) {
      await db.execute('CREATE TABLE new_table (id INTEGER PRIMARY KEY, name TEXT)');
    }
  }
}

 

버전 관리의 흐름

  1. 앱 출시 초기:
    • version: 1로 설정.
    • onCreate를 통해 기본 테이블 구조 생성.
  2. 앱 업데이트:
    • 새로운 컬럼이나 테이블이 필요하다면 version: 2로 증가.
    • onUpgrade에 스키마 변경 작업 추가.
  3. 다음 앱 업데이트:
    • 새로운 스키마가 필요할 때 version: 3으로 설정.
    • onUpgrade에 oldVersion과 newVersion을 비교하여 단계별 변경 작업 수행.

중요한 점

  • 기존 데이터 유지:
    • onUpgrade에서 스키마 변경 작업을 수행하더라도, 기존 데이터는 삭제되지 않습니다.
    • 변경 작업이 기존 데이터를 손상하지 않도록 주의해야 합니다.
  • 데이터 마이그레이션:
    • 스키마 변경으로 인해 기존 데이터를 변환해야 하는 경우, 데이터 마이그레이션 작업을 onUpgrade에서 처리해야 합니다.
반응형