728x90
※출처 - 꼼꼼한 재은씨의 Swift: 실전편
코어 데이터 이해하기
- 코어 데이터는 여러 계층에서 서로 협력하는 다양한 객체들로 이루어져 있다.
객체 그래프 관리자(Object Graph Manager)
- 애플 가이드에선 코어 데이터를 '애플리케이션에서 모델(Model) 계층의 객체를 관리하는 데 사용하는 프레임워크이자, 라이프 사이클이나 영속성 관리를 위한 기능을 제공하는 객체 그래프 관리자(Object Graph Manager)'로 정의하고 있다.
- 코어 데이터는 영구 저장소에 저장된 각각의 레코드를 읽어들인 다음, 독립적인 객체 형태로 만들어낸다.
- 때문에 우리가 데이터를 다루는 행위는 코어데이터에서는 모두 객체 단위로 이루어진다.
- 객체가 독립적이라 해서 다른 객체와 단절됨을 의미하지 않는다.
- 코어 데이터에서 정규화된 데이터 객체는 다른 객체와 참조 관계에 있으며, 서로의 관계를 통해 데이터의 완전성을 보장받을 수 있다.
- 이 때 객체를 하나의 노드로 간주하고 서로 간의 관계를 링크로 이어보면 얻는 형태가 '객체 그래프' 이다.
- 코어 데이터가 객체 그래프를 담당한다는 의미는 '객체 A와 객체 B를 연결할 수 있고 이 연결을 통해 A, B는 영속적으로 동기화된다' 는 의미다.
- 즉 객체 A에서 업데이트가 발생하면 B도 업데이트되고 A가 삭제되면 B에서 관련된 데이터가 삭제된다.
- 데이터베이스에선 외래키로 연결이 되어있어도 SQL문을 통한 JOIN 과정을 거쳐야 다른 테이블의 연관 데이터를 불러올 수 있다.
- 이러한 작업을 코어 데이터에서 알아서 진행해준다.
코어 데이터의 구조
1. 관리 객체 (Managed Object)
- 코어 데이터에서 데이터를 저장하기 위해 생성하는 인스턴스이다.
- 관계형 데이터베이스에서 테이블의 행, 레코드로 생각하면 된다.
- 코어 데이터에서는 모든 레코드를 객체화하여 다루기 때문에 테이블의 행 하나하나에 해당하는 레코드가 독립된 객체로 동작하게 된다.
- 이 때 레코드를 구성하는 column들은 객체의 속성(attributes)이 된다.
- 코어 데이터에서 사용되는 관리 객체는 모두 NSManagedObject 클래스나 그 하위 클래스의 인스턴스이다.
- 모든 생성된 관리 객체들은 '관리 객체 컨텍스트' 에 담겨 관리된다.
2. 관리 객체 컨텍스트 (Managed Object Context)
- 코어 데이터에서 가장 핵심적인 객체로 크게 두 가지 역할을 담당한다.
- 관리 객체를 담거나 생성, 삭제하는 Box의 역할
- 컨텍스트를 통해서 새로운 관리 객체를 생성, 혹은 기존에 있는 관리 객체를 삭제 할 수 있다.
- 컨텍스트에 담긴 모든 관리 객체를 영구 저장소로 보내 저장할 수도 있다.
- 즉, 데이터를 읽고 쓰고 하는 작업은 모두 컨텍스트를 통해 이루어진다.
- 코어 데이터는 모든 데이터를 메모리에 로드한 상태에서 처리한다고 했는데 이 때의 메모리가 컨텍스트를 의미한다.
- 영구 저장소 및 영구 저장소 코디네이터에 대한 관리자
- 우리는 컨텍스트 객체의 특정 메소드를 호출하는 것만으로 데이터를 읽거나 쓰는 것이 가능하다.
- 하지만 실질적인 읽기, 쓰기 작업은 영구 저장소 코디네이터에서 처리하는 데 이것에 대한 관리를 담당한다.
- 관리 객체를 담거나 생성, 삭제하는 Box의 역할
3. 영구 저장소 코디네이터 (Persistent Store Coordinator)
- 코디네이터는 컨텍스트와 직접 데이터를 주고 받으면서 다양한 영구 저장소들의 접근을 조정하고, 해당 저장소에 대한 실제 입출력을 담당한다.
- 만약 필요한 객체가 컨텍스트에 로딩되지 않았다면 컨텍스트가 코디네이터에 요청하고 코디네이터는 영구 저장소에서 데이터를 찾아 컨텍스트에 전달한다.
- 이 과정에서 코디네이터는 미리 정의된 관리 객체 모데을 이용하여 인스턴스를 생성해 데이터를 담아 전달하는 데 이것이 관리 객체(Managed Object) 이다.
- 개발자가 직접 코디네이터에 접속해서 처리할 일은 없다.
4. 관리 객체 모델 (Managed Object Model)
- 데이터베이스로 치자면 테이블의 구조를 정의하는 스키마(Schema)에 해당하는 것
- 코어 데이터에서 테이블에 대응되는 엔터티(Entity)의 구조를 정의하는 객체
- 관리 객체 모델은 Xcode에서 설계한 엔터티로부터 생성된다.
- 관리 객체가 데이터, 데이터가 담긴 그릇이라면 관리 객체 모델은 그릇을 찍어내는 틀의 역할
5. 영구 객체 저장소 (Persistent Object Store)
- 코어 데이터를 사용할 때 데이터가 저장되는 저장소 환경을 의미
- 내부적으로 코어 데이터는 데이터에 대한 변경 사항을 해석하여 영구 저장소에 저장한다.
- 영구 저장소는 다음 4가지 타입이 있다.
타입 | 설명 |
인메모리 저장소 타입 (NSInmemoryStoreType) |
- 메모리 기반 저장소 사용 방식 - 사실상 영구 저장소를 사용하지 않는 것과 동일하다. - 즉, 앱을 종료했을 때 데이터가 보존되지 않는다. - 주로 데이터 객체의 런타임 캐싱에 사용된다. |
플랫 바이너리 저장소 타입 (NSBinaryStoreType) |
- 데이터를 단순 바이너리 파일 형식으로 저장하는 방식 - 장점: 데이터 조회 성능을 개선할 수 있음 - 단점: 저장된 데이터의 크기가 커지면 바이너리 파일도 커지고 로딩 시간이 늘어난다. |
XML 저장소 타입 (NSXMLStoreType) |
- 파일을 데이터로 저장하긴 하지만 바이너리 파일이 아닌 XML 방식으로 데이터를 변환하여 기록한다. - 파일에 저장하기 때문에, 항상 전체가 저장되거나 저장되지 않는 원자성을 띈다. - 장점: 코드를 외부에서 열어서 판독하는 것이 가능하기 때문에 디버깅 및 저장 여부 확인 필요 시 많이 사용 - 단점: 처리속도가 느림 - iOS에선 속도 및 성능의 제약으로 인해 사용 못함 |
SQLite 데이터베이스 (NSSQLiteStoreType) |
- 가장 많이 사용하는 타입 - 일부만 로딩하기 때문에 메모리에 객체 그래프가 완전히 로딩되어 있지 않을 수도 있다. - iOS프로젝트에서 코어 데이터가 기본으로 채택하는 방식 |
728x90
'iOS > 설명' 카테고리의 다른 글
[iOS] hitTest (0) | 2022.02.16 |
---|---|
[iOS] Stretchable Image를 이용해 이미지 늘리기 (feat. 9-patch) (0) | 2022.02.08 |
[iOS] CoreData - (1) (0) | 2022.02.01 |
[iOS] M1 환경에서 pod install 에러 발생 시 대처 (0) | 2022.01.22 |
[iOS] 코코아팟 (Cocoapods) 설치 및 사용 (0) | 2022.01.22 |
댓글