처음 투두 어플을 구현할 당시 Userdefault를 사용해서 데이터 베이스를 만들었다.
이후 coreData에 대한 호기심이 생기면서 간략하게 찾아보며 정리한 글이 있었는데, 해당 내용에서 직접 사용해보고 더 공부를 해보며 든 생각 + 코어 데이터 개념을 조금 더 정리를 해보고자 글을 적어본다.
들어가기 앞서 CoreData와 연관된 키워드, 데이터가 생각보다 많다.
단순히 데이터를 저장하는 데이터 저장소로 이해하고 있지만 하나의 데이터를 저장하기 위해 여러 프레임워크, 객체를 거쳐 가야하는데 - 이는 데이터 모델에 존재하는(선언된) Entity만을 위한 데이터가 저장될 수 있도록 확인을 하기 위해 거치는 작업이다.
2005년 등장한 object management와 Data persistence framework.
이전에 정리한대로 CoreData를 관계형 데이터베이스라고 정리를 했는데, 일반적인 데이터베이스는 아니다.
더 정확하게 말하면 CoreData는 객체들의 그래프라고 생각해야하는데, 데이터베이스처럼 정렬이 된 구조가 아니기 때문인 것 같다. 위 이미지처럼 CoreData의 데이터는 객체들의 모임으로 '관계'로 서로 연결된, 하나의 마인드맵 같은 구조다!
CoreData 프레임워크는 데이터를 저장할 수 있는 기능이 있을 뿐만 아니라 다양한 기능이 있다고 하는데, 인풋 검사(?)(input validation), 데이터 모델 자동 업데이트(data model versioning), 상태 변화 감지(change tracking) 등도 지원한다고~
단, 관계형 데이터베이스가 되기 위해 받아들일 테이블을 선언해야하는데 이를 entity라 부른다.
지금까지 이해한 내용 바탕으로 간략하게 CoreData 구조를 정리해봤다.
해당 내용을 바탕으로 조금씩 덧붙여보도록 하겠다!
Entity는 앞서 정리한대로 CoreData에서 받을 테이블이라고 생각하면 이해하기 쉽다고 한다.
내가 보기에 entity는 구조체 같은 개념으로 느껴지기도 하는데, 하나의 객체(entity)가 가지는 속성(property)를 담을 수 있기 때문이다.
위 이미지에서도 Employee라는 Entity가 나이와 이름이라는 속성을 가진다는 점을 알 수 있다. CoreData에서 Entity는 NSEntityDescription class의 객체로 표현이 되는데, 사실상 복잡해 보이는 이름에서 'NS'를 제거하면 Entity + Description으로 - 객체의 추가 설명 데이터라는 점을 이해할 수 있다.
따라서 entity는 말 그대로 내가 담고 싶은 데이터의 구조를 의미한다.
어떤 데이터 타입, 속성을 하나의 그룹으로 묶어 둘 것인지 일종의 청사진을 남기는 셈이다.
위에 선언한 Entity를 코드상에서 보면 타입이 NSManagedObject로 선언이 되어 있다.
ManagedObject는 CoreData에서 선언한 Entity의 객체를 의미한다!
데이터를 런타임에 표시할 일종의 데이터 타입인셈인데, 이 타입은 여러 데이터와 관계를 맺고 있는데, NSEntityDescription으로부터 데이터에 대한 메타 데이터를 받기도, 다른 ManagedObject의 내용을 파악하기도 한다고 한다.
한가지 특이 사항은 딕셔너리처럼 행동을 하고 데이터를 효율적으로 보관한다고 한다.
EntityDescription은 위에 정리한대로 데이터에 대한 메타 데이터를 담당한다.
초기 CoreData에서 받는 테이블을 Entity라 칭했는데, 해당 테이블이 가질 속성들(attribute, relationship) 등을 NSEntityDescription이라 한다.
NSManagedObject의 컬렉션을 다루는 NSManagedObject Context는 데이터베이스와 어플 사이에서 오작교 같은 역할을 한다.
앞서 설명한 객체인 ManagedObject의 생명 주기를 관리하는데, CRUD의 모든 행동은 Managed Object Context를 거쳐 데이터베이스(Core Data)로 저장이 된다.
CRUD뿐만 아니라 데이터를 가지고 오는 Fetch 역할 또한 담당하는데, 쉽게 말해 managedObject(객체)에서 발생하는 모든 변화와 과정을 지켜보고 있는 옵저버 같은 역할을 한다.
한가지 특징은 context는 하나의 객체를 담당하는데, 해당 객체에서 변화가 발생할 경우 데이터베이스로 바로 상태를 업데이트하지 않고 메모리로 context가 변화된 상태를 보관하고 있다가 CoreData가 저장소로 해당 상태를 옮기면 저장이 된다고 한다.
Changes to managed objects remain in memory in the associated context until Core Data saves that context to one or more persistent stores. A single managed object instance exists in one and only one context, but multiple copies of an object can exist in different contexts. Therefore, an object is unique to a particular context.
CoreData는 사실상 데이터베이스가 아니기 때문에 이 Coordinator이 없다면 데이터 저장 자체가 불가능하다고 한다. 데이터를 저장하는 이 객체가 생성되기 위해서는 managedObject Model을 먼저 구성해야한다. 어떤 데이터를 활용하는지 파악해야하기 때문이다!
https://cocoacasts.com/working-with-managed-objects-in-core-data
https://cocoacasts.com/exploring-the-core-data-stack