코어 데이터(Core Data)는 iOS 앱에서 데이터를 관리하고 저장하기 위해 사용되는 프레임워크입니다. 앱의 데이터 모델이 변경되는 경우, 이전 버전의 데이터와의 호환성 문제가 발생할 수 있습니다. 이때, 코어 데이터 마이그레이션을 통해 이전 데이터를 새로운 데이터 모델에 맞게 변환할 수 있습니다.
마이그레이션 종류
코어 데이터 마이그레이션은 크게 두 가지로 분류됩니다.
- 경량 마이그레이션(Lightweight Migration)
- 수동 마이그레이션(Manual Migration)
경량 마이그레이션 (Lightweight Migration)
경량 마이그레이션은 새로운 데이터 모델과 이전 데이터 모델 사이에서 속성(attribute), 엔티티(entity)의 추가 및 삭제 등과 같은 단순한 변경 사항이 있는 경우에 사용됩니다. 이 경우, 코어 데이터가 자동으로 마이그레이션을 처리합니다.
경량 마이그레이션을 사용하는 경우에는 데이터 스토어(coordinator) 설정 시 아래와 같이 NSMigratePersistentStoresAutomaticallyOption
과 NSInferMappingModelAutomaticallyOption
옵션을 활성화하는 것이 중요합니다.
let options = [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType,
configurationName: nil,
at: url,
options: options)
수동 마이그레이션 (Manual Migration)
수동 마이그레이션은 경량 마이그레이션으로 해결할 수 없는 복잡한 데이터 모델 변경에 사용됩니다. 이 경우, 수동으로 데이터 모델 간의 변환 매핑을 구현해야 합니다.
수동 마이그레이션을 위해선 다음과 같은 과정을 따라야 합니다.
- 이전 데이터 모델과 새로운 데이터 모델 사이의 변환 매핑 파일 생성
- 이전 데이터 모델에서 새로운 데이터 모델로 데이터를 이동
- 코어 데이터 스키마(coordinator)에 새로운 데이터 모델 설정
let sourceURL = Bundle.main.url(forResource: "OldDataModel", withExtension: "momd")!
let destinationURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
let mappingModel = NSMappingModel(from: [Bundle.main], forSourceModel: sourceModel, destinationModel: destinationModel)!
let migrationManager = NSMigrationManager(sourceModel: sourceModel, destinationModel: destinationModel)
try migrationManager.migrateStore(from: sourceURL, sourceType: NSSQLiteStoreType, options: nil, with: mappingModel, toDestinationURL: destinationURL, destinationType: NSSQLiteStoreType, destinationOptions: nil)
위의 예시 코드에서 sourceModel
은 이전 데이터 모델의 모델 객체, destinationModel
은 새로운 데이터 모델의 모델 객체입니다.
마무리
코어 데이터 마이그레이션은 데이터 모델 변경 시 호환성 문제를 해결하기 위해 중요한 기능입니다. 경량 마이그레이션은 단순한 변경 사항에 대해서는 자동으로 처리되지만, 복잡한 변경 사항에 대해서는 수동으로 처리해야 합니다. 이를 통해 앱의 데이터 관리 및 업그레이드 과정을 원활하게 수행할 수 있습니다.
더 자세한 사항은 Apple 공식 문서를 참고하세요.