ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS) Core Data (1) - over view
    iOS 2021. 1. 25. 19:12

    코어 데이터는 데이터를 영구적으로 저장할 때 사용하는 기술이다.

    '영구적'의 의미는 앱을 종료 하더라도 유지되는 데이터이다.

     

    Object Graph Management Tool

     

    core data는 4가지의 객체로 구성되어 있다.

     

    - Persistent Store: NSPersistentStore

    이름 그대로 영구 저장소이다.

    메모리에 저장되어 앱이 종료 될 시 없어지는 데이터와 달리 앱이 종료 되거나 전원이 차단되어도 계속 유지된다.

    기본적으로 4가지 영구 저장소를 제공하고 custom 저장소를 구현하는 것도 가능하다.

     

    영구저장소는 데이터를 메모리에 로딩하는 방식에 따라서 Atomic store과 non-atomic store로 나뉜다.

    아토믹은 데이터를 처리할 때 모든 데이터를 메모리에 로드해야 한다.

    넌-아토믹 저장소는 필요한 부분만 로드한다.

     

    core data는 넌-아토믹 저장소인 SQLite를 기본 저장소로 사용한다.

     

    - Object Model: NSMangedObjectModel

    어떤 데이터가 저장되고 데이터들이 어떤 관계를 가지고 있는지 설명하는 객체이다.

    영구 저장소에 데이터를 저장하기 위해선 어떤 구조로 저장해야 하는지 알아야 하는데 여기에 필요 한 모든 정보가 여기 저장된다.

    코드를 통해 직접 모델을 구성할 수 있지만, xcode의 모델 편집기를 사용한다.

     

    - Persistent Store Coordinator: NSPersistentStoreCoordinator

    영구저장소 코디네이터는 영구저장소에 있는 데이터를 가져오거나 저장하는 중계 객체이다.

    context 객체를 통해 데이터를 저장하면 object 모델을 통해 구조를 파악 한 다음에 영구 저장소에 알아서 데이터를 저장한다.

     

    - Managed Object Context: NSManagedObjectContext

    코어 데이터를 통해 실행하는 작업은 대부분 context를 통해 실행 된다. 

    코어 데이터에서 데이터를 생성하면 바로 영구저장소에 저장되지 않고 context 내부에 임시 데이터로 저장된다. 이후 요청을 해야만 영구 저장소에 저장된다.

    만약 context를 저장하지 않고 앱이 종료되면 저장되지 않은 모든 데이터가 사라진다.

    데이터를 불러오는 것 또한 영구 저장소의 원본 데이터가 아닌 복사본이다. 그래서 context에 있는 데이터를 수정하여도 원본 데이터는 수정되지 않는다. 수정 된 내용을 저장하려면 context를 저장해야 한다.

    보통 하나의 context를 사용하지만, 여러가지의 context를 사용하기도 한다.

     

     

    위의 4가지 객체를 묶어서 Core Data Stack이라고 한다.

    대부분의 작업은 context가 제공하는 API를 통해 구현한다. 나머지 3객체는 초기화 시점을 제외하곤 자주 사용하지 않는다.

     

    - Persistent Container: NSPersistentContainer

    iOS 10 이상의 버젼에서 container라는 개념이 도입 되었다. 이는 Core Data Stack을 캡슐화 한 객체이다.

    앞으로 이 객체를 통해 위의 4개의 객체에 빠르게 접근 가능하다.

     

     

     

    Core Data 예제

    프로젝트를 생성 할 때 

     

    use core data 부분을 체크 해주면 AppDelegate에 자동으로 관련 객체들이 생성 된다.

     

    앞서 말한 Persistent Container를 통해 다른 core data 객체에 접근 가능하다.

    아래의 save 메소드는 context를 저장하는 메소드인데 리소스 낭비를 방지하기 위하여 hasChanges를 통해서 값의 변화가 있는지 확인 후 저장하는 것이 중요하다.

     

     

    댓글

Designed by Tistory.