swift CoreData 스택에 대해 공부해보자
Core Data는 iOS 및 macOS 애플리케이션에서 데이터를 모델링하고 관리하는 데 사용되는 프레임워크입니다. Core Data 스택은 이러한 데이터 관리 작업을 처리하기 위한 구성 요소들의 집합을 의미합니다. 여기서 NSManagedObjectContext는 이 스택의 핵심 구성 요소 중 하나입니다.
Core Data 스택
Core Data 스택은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
- NSManagedObjectModel: 데이터 모델을 정의합니다. 이는 애플리케이션에서 사용할 엔티티(entity), 속성(attribute), 관계(relationship) 등을 설명하는 데이터베이스 스키마와 유사합니다.
- NSPersistentStoreCoordinator: 영구 저장소와 상호작용하는 데 사용됩니다. 여러 NSPersistentStore 객체(예: SQLite, XML, binary 등)를 관리하고, 이를 통해 데이터 모델을 영구 저장소에 저장하거나, 영구 저장소에서 가져옵니다.
- NSManagedObjectContext: 임시 데이터 저장소로, 애플리케이션에서 데이터를 관리하고 조작하는 데 사용됩니다. NSManagedObjectContext는 영구 저장소와 상호작용하여 데이터를 가져오거나, 데이터를 저장할 수 있습니다.
각 구성 요소의 역할
1. NSManagedObjectModel
NSManagedObjectModel은 애플리케이션의 데이터 모델을 정의합니다. 이는 데이터베이스의 스키마와 비슷하게, 엔티티와 속성, 관계를 정의하는 데 사용됩니다. 데이터 모델은 .xcdatamodeld 파일로 정의되며, Xcode에서 시각적으로 편집할 수 있습니다.
2. NSPersistentStoreCoordinator
NSPersistentStoreCoordinator는 영구 저장소를 관리하는 역할을 합니다. 이는 여러 저장소를 조정하고, NSManagedObjectContext가 영구 저장소와 상호작용할 수 있도록 합니다. 영구 저장소는 SQLite, XML, binary 등 다양한 형식으로 존재할 수 있습니다.
3. NSManagedObjectContext
NSManagedObjectContext는 메모리 내에서 데이터를 관리하고 조작하는 임시 저장소입니다. 이는 애플리케이션의 데이터 변경 사항을 추적하고, 데이터를 추가, 삭제, 수정할 수 있는 인터페이스를 제공합니다. NSManagedObjectContext는 변경 사항을 영구 저장소에 저장하거나, 영구 저장소에서 데이터를 가져오는 데 사용됩니다.
Core Data 스택의 작동 방식
Core Data 스택은 다음과 같은 순서로 작동합니다:
- 모델 로드: NSManagedObjectModel을 로드하여 애플리케이션의 데이터 모델을 설정합니다.
- 저장소 코디네이터 설정: NSPersistentStoreCoordinator를 생성하고, 영구 저장소를 추가하여 데이터 모델을 영구 저장소와 연결합니다.
- 컨텍스트 설정: NSManagedObjectContext를 생성하고, 이를 NSPersistentStoreCoordinator에 연결합니다. 이를 통해 데이터베이스와의 상호작용이 가능해집니다.
예시 코드: Core Data 스택 설정
다음은 Core Data 스택을 설정하는 예시 코드입니다.
import CoreData
class CoreDataStack {
// 1. 데이터 모델 생성
private lazy var managedObjectModel: NSManagedObjectModel = {
guard let modelURL = Bundle.main.url(forResource: "Model", withExtension: "momd") else {
fatalError("Failed to find data model")
}
guard let model = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Failed to load data model")
}
return model
}()
// 2. 영구 저장소 코디네이터 생성
private lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("CoreData.sqlite")
do {
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
} catch {
fatalError("Failed to add persistent store: \(error)")
}
return coordinator
}()
// 3. 관리 객체 컨텍스트 생성
lazy var context: NSManagedObjectContext = {
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
context.persistentStoreCoordinator = self.persistentStoreCoordinator
return context
}()
// 앱의 도큐먼트 디렉토리 경로
private lazy var applicationDocumentsDirectory: URL = {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}()
}
핵심 요약
- NSManagedObjectModel: 데이터 모델을 정의합니다.
- NSPersistentStoreCoordinator: 영구 저장소를 관리합니다.
- NSManagedObjectContext: 데이터 변경 사항을 추적하고, 데이터를 추가, 삭제, 수정합니다.
이렇게 설정된 Core Data 스택을 통해 애플리케이션은 데이터를 효율적으로 관리하고, 영구 저장소와 상호작용할 수 있습니다.
각자 역활이 이렇게 나누어 지는 것을 알게되었네요.
자주 사용해봐야 익혀질거 같네요. 앞으로도 코어데이터 많이 사용해보겠습니다. 아자자