방구석 컴퓨터/플러터
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)');
}
}
}
버전 관리의 흐름
- 앱 출시 초기:
- version: 1로 설정.
- onCreate를 통해 기본 테이블 구조 생성.
- 앱 업데이트:
- 새로운 컬럼이나 테이블이 필요하다면 version: 2로 증가.
- onUpgrade에 스키마 변경 작업 추가.
- 다음 앱 업데이트:
- 새로운 스키마가 필요할 때 version: 3으로 설정.
- onUpgrade에 oldVersion과 newVersion을 비교하여 단계별 변경 작업 수행.
중요한 점
- 기존 데이터 유지:
- onUpgrade에서 스키마 변경 작업을 수행하더라도, 기존 데이터는 삭제되지 않습니다.
- 변경 작업이 기존 데이터를 손상하지 않도록 주의해야 합니다.
- 데이터 마이그레이션:
- 스키마 변경으로 인해 기존 데이터를 변환해야 하는 경우, 데이터 마이그레이션 작업을 onUpgrade에서 처리해야 합니다.
반응형