카테고리 없음

swift CoreData 스택에 대해 공부해보자

kingarthur 2024. 8. 8. 13:31

Core Data는 iOS 및 macOS 애플리케이션에서 데이터를 모델링하고 관리하는 데 사용되는 프레임워크입니다. Core Data 스택은 이러한 데이터 관리 작업을 처리하기 위한 구성 요소들의 집합을 의미합니다. 여기서 NSManagedObjectContext는 이 스택의 핵심 구성 요소 중 하나입니다.

Core Data 스택

Core Data 스택은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  1. NSManagedObjectModel: 데이터 모델을 정의합니다. 이는 애플리케이션에서 사용할 엔티티(entity), 속성(attribute), 관계(relationship) 등을 설명하는 데이터베이스 스키마와 유사합니다.
  2. NSPersistentStoreCoordinator: 영구 저장소와 상호작용하는 데 사용됩니다. 여러 NSPersistentStore 객체(예: SQLite, XML, binary 등)를 관리하고, 이를 통해 데이터 모델을 영구 저장소에 저장하거나, 영구 저장소에서 가져옵니다.
  3. NSManagedObjectContext: 임시 데이터 저장소로, 애플리케이션에서 데이터를 관리하고 조작하는 데 사용됩니다. NSManagedObjectContext는 영구 저장소와 상호작용하여 데이터를 가져오거나, 데이터를 저장할 수 있습니다.

각 구성 요소의 역할

1. NSManagedObjectModel

NSManagedObjectModel은 애플리케이션의 데이터 모델을 정의합니다. 이는 데이터베이스의 스키마와 비슷하게, 엔티티와 속성, 관계를 정의하는 데 사용됩니다. 데이터 모델은 .xcdatamodeld 파일로 정의되며, Xcode에서 시각적으로 편집할 수 있습니다.

2. NSPersistentStoreCoordinator

NSPersistentStoreCoordinator는 영구 저장소를 관리하는 역할을 합니다. 이는 여러 저장소를 조정하고, NSManagedObjectContext가 영구 저장소와 상호작용할 수 있도록 합니다. 영구 저장소는 SQLite, XML, binary 등 다양한 형식으로 존재할 수 있습니다.

3. NSManagedObjectContext

NSManagedObjectContext는 메모리 내에서 데이터를 관리하고 조작하는 임시 저장소입니다. 이는 애플리케이션의 데이터 변경 사항을 추적하고, 데이터를 추가, 삭제, 수정할 수 있는 인터페이스를 제공합니다. NSManagedObjectContext는 변경 사항을 영구 저장소에 저장하거나, 영구 저장소에서 데이터를 가져오는 데 사용됩니다.

Core Data 스택의 작동 방식

Core Data 스택은 다음과 같은 순서로 작동합니다:

  1. 모델 로드: NSManagedObjectModel을 로드하여 애플리케이션의 데이터 모델을 설정합니다.
  2. 저장소 코디네이터 설정: NSPersistentStoreCoordinator를 생성하고, 영구 저장소를 추가하여 데이터 모델을 영구 저장소와 연결합니다.
  3. 컨텍스트 설정: 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 스택을 통해 애플리케이션은 데이터를 효율적으로 관리하고, 영구 저장소와 상호작용할 수 있습니다.

 

각자 역활이 이렇게 나누어 지는 것을 알게되었네요. 

자주 사용해봐야 익혀질거 같네요. 앞으로도 코어데이터 많이 사용해보겠습니다. 아자자