Core Data 뿌시기

CoreData

Core Data 는 프레임 워크이다. 이를 사용하면 디바이스에 permanent data(영구적인 데이터)를 저장할 수 있다.

 

UserDefaults 랑은 조금 다른 개념인데 UserDefaults가 app setting과 같은 간단한 정보를 저장하기 적합하다면, Core Data는 복잡하고 큰 user data를 저장하기에 적합하다.

 

Core Data는 앱에서 모델 계층 계체를 관리하는데 사용하는 프레임워크로 DB는 아니다.


CoreData의 기능

  • persistence(영속성)
    Core Data는 객체를 저장소에 매핑하는 세부 정보를 추상화하여 DB를 직접 관리하지 않고도 Swift 데이터를 쉽게 저장할 수 있다.
  • 개별, 일괄 변경 사항 Undo, Redo
    Core Data의 실행 취소 관리자는 변경 사항을 추적하고 개별적으로나 그룹적으로 한 번에 롤백할 수 있어 앱에 Undo 및 Redo를 쉽게 추가할 수 있다.
  • 백그라운드 데이터 작업
    백그라운드에서 JSON을 객체로 구문 분석하는 것과 같은 데이터 작업을 수행한다. 그 이후 결과를 캐시 하거나 저장하여 서버에 갔다 오는 횟수를 줄일 수도 있다.
  • 동기화
    Core Data는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화 상태로 유지하는데 도움을 준다.
  • 버전 관리 및 Migration
    Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있다.

그럼 한번 코어데이터를 만들어보자

 

Cmd + n 을 통해 새로운 코어 데이터를 추가할 수 있다.

Add Entity를 눌러 새로운 Entity를 만들면 된다. 여기서 Entity는 저장될 데이터들의 집합이라고 생각하면 된다.

이번엔 Entity 안에 Attribute를 추가해보자

Entity가 데이터의 집합이라고 했는데 Attribute는 그 집합의 원소라고 보면된다.

 

즉 전화번호부가 Entity 라고 했을때 Attribute는 전화번호, 사람이름, 사람에 대한 메모 정도라고 보면 된다.

그 이후 오른쪽 인스펙터를 보면 Class Definition이 있는데 이렇게 3가지가 있다.

Manual / None

관리 객체 하위 클래스의 프로퍼티, 논리를 편집

 

Class Definition

생성된 논리나 프로퍼티를 편집할 필요가 없을 경우 선택

 

Category / Extension

관리 객체 하위 클래스에 추가적인 메서드나 비즈니스 논리를 추가하고 싶은 경우 선택


그 이후 코어 데이터를 저장하기 위해선 Core Data Stack을 설정해야한다.

  • Persistent Container 를 생성한다.
  • View Controller에 생성한 Persistent Container를 전달한다.
  • Persistent Container를 서브 클래싱 한다.

아래의 그림을 참고해보면 좋을 것 같다.

NSManagedObjectModel의 인스턴스는 앱의 타입, 프로퍼티, 관계를 설명하는 앱의 모델 파일이다.

NSManagedObjectContext의 인스턴스는 앱 타입의 인스턴스에 대한 변경 사항을 추적한다.

NSPersistentStoreCoordinator의 인스턴스는 스토어에서 앱 타입의 인스턴스를 저장하고 가져온다.

NSPersistentContainer의 인스턴스는 모델, 컨텍스트, 스토어 coordinator를 한 번에 설정한다.


자 여기까지 정리해서 Core Data를 사용하는 순서를 조금 더 세분화 해보자

  • NSManagerdObjectContext로 Persistent Container를 생성한다.
  • View Controller에 생성한 Persistent Contrainer를 전달한다.
  • Entity 를 가지고 온다.
  • NSManagedObject를 만든다.
  • NSManagedObjectContext에 저장한다.
  • 잘 저장되었는지 앱을 종료하고 확인해본다.

이 과정을 하나하나 세분화 해서 한번 해보자

1 . NSManagerdObjectContext로 Persistent Container를 생성

lazy var persistentContainer: NSPersistentContainer = {
   let container = NSPersistentContainer(name: "DataModel")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            
            
            
            fatalError("Unresolved error \\(error), \\(error.userInfo)")
        }
    })
    return container
}()

 

생성자 이름에 코어데이터 이름이 제대로 들어가 있는지 꼭 확인하기

 

 

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \\(nserror), \\(nserror.userInfo)")
        }
    }
}

 

2. View Controller에 생성한 Persistent Contrainer를 전달한다.

이제 사용할 View Controller 에 가서 지금 생성한 Persistent Container를 전달받자

var container: NSPersistentContainer!

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var priceLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    self.container = appDelegate.persistentContainer
    
}

3. Entity를 가지고 온다.

lazy var entity: NSEntityDescription? = {
    return NSEntityDescription.entity(forEntityName: "title", in: self.container.viewContext)
}()

위에서 만든 Entity를 가져온다.

4. NSManagedObject를 만든다.

 

내가 설정한 데이터를 넣으니 잘 되지 않아 일단 예시 이미지로 대체한다.. 내가 넣었던 자료를 다시 넣어보고 시도한 후 수정할 예정

5. NSManagedObjectContext에 저장한다.

do {
    try self.container.viewContext.save()
} catch {
    print(error?.localizedDescription)
}

 

이렇게 하면 코어 데이터를 사용할 수 있다고는 하지만 아직 많이 어려운 개념인 것 같다..

반복적으로 공부하면서 코어 데이터를 꼭 마스터하자