CoreData + 자문자답

Kyo Pak·2023년 4월 3일
2
post-thumbnail

1️⃣ CoreData란?


CoreData는 Model 계층의 객체를 관리하는 프레임워크이자 객체의 영속성 관리를 위한 기능을 제공하는 객체 그래프 관리자이다.
CoreData의 기능에 디바이스에 Permanent Data(영구적인 데이터)를 저장할 수 있는 Persistence가 있는 것이다.

객체 그래프 관리자
CoreData는 객체(Entity)들끼리 Relationship을 구성할 수 있다.
메모리에 객체들이 여러 RelationShip으로 연관되어져 있는 것을 객체 그래프라고하고, 이 형태를 CoreData의 Container에 저장시킨다.
때문에 CoreData를 객체 그래프 관리자라고 하기도 한다.
객체 그래프 관리자는 메모리 내에 그래프를 유지하며, 객체 그래프를 관리한다.

📌 CoreData는 DB일까?

  • CoreData는 DataBase가 아니라 Framerwork이다.
    그리고 CoreData가 DBMS일은 수행하지만 그 일만 하지는 않는다.
    - DBMS는 Database Management System인데 데이터를 가공해서 쓰기 쉽게해준다.
  • CoreData가 Persistence(영속성)기능도 가지고 있지만 여러 기능을 가지고 있다.

📌 CoreData의 여러가지 기능

  1. CoreData의 주요 기능인 Persistence는 관계형 DataBase인 SQLite에 의해서 지원된다.
  2. ORM
  3. 개별, 일괄 변경 사항 Undo, Redo
    • CoreData의 실행 취소 관리자는 변경 사항을 추적하고 개별적으로나 그훕적으로 한번에 롤백할 수 있는 Undo, Redo를 사용할 수 있다. 예시 : 글쓰다가 기기를 흔들면 글자가 사라지는 기능 등
  4. 백그라운드 데이터 작업
    • 백그라운드에서 JSON을 객체로 분석하는 것과 같은 데이터 작업을 수행한다. 그 결과 결과를 캐시하여 저장하여 서버 방문 횟수를 줄일 수 있다.
  5. 동기화
    • CoreData는 테이블, 컬렉션 뷰에 대한 DataSource를 제공하여 View와 Data를 동기화 상태로 유지하는데 도움을 준다.
  6. 버전 관리 및 Migration
    • CoreData는 데이터 모델 변경에 따른 버전을 관리할 수 있고, Migration하여 Data가 소실되지 않게 끔 하는 메커니즘을 가지고 있다.

📌 Entity란?

Entity는 데이터베이스에서의 테이블이라고 생각하면 편한다. 실제로 SQLite의 테이블과 매핑된다.

📌 ORM은 무슨 기능일까?

관계형 DataBase와 소통하기 위해서는 SQL이라는 언어를 사용한다.

ORM은 (Object Relation Mapping) 객체와 데이터베이스의 관계를 맵핑해주는 도구이다.
ORM은 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 도구이다.

즉, ORM이란 내가 앱을 만드는데 사용하고 있는 언어를 SQL로 번역해준다고 생각하면 된다.
CoreData는 SQLite의 지원을 받기 때문에 SQL문 작성이 필요하지만 ORM기능을 제공하기 때문에 개발자가 직접 SQL작성할 필요없이 자동으로 객체와 데이터베이스의 데이터가 매핑된다.


2️⃣ CoreData와 다른 저장소와의 비교


📌 CoreData vs DataBase

데이터베이스는 영속적이고 검색가능한 데이터 저장소다.
이 저장소의 목적은 최신 데이터를 저장하고 로드에오고 업데이트하는것이 주요 목적이다.

하지만 CoreData는 이러한 데이터저장소의 역할도 수행하지만 여러 기능을 추가적으로 가지고 있다.
또한 CoreData는 비검색의 특징을 가지고 있습니다.
객체들이 할당되고 연결되었을 경우, 한 객체에 접근하면 그 객체의 관계가 있는 다른 객체들에게 접근이 가능해진니다.

또한 다른 데이터베이스와 다르게 CoreData는 인메모리 형태로 사용이 가능하다.
대부분 Persistence기능을 활용하지만, In-Memory 형태로 Cache처럼 사용이 가능하다.

📌 CoreData vs UserDefault

일단 UserDefault는 적은 양의 데이터를 저장하는 데 사용하기 적합하다.
그래서 보통 유저의 앱에 대한 셋팅과 같은 민감한 정보를 저장하지 않는데 사용한다.
또한, UserDefault는 암호화되지 않는다. 그리고 또 On-Disk다.

하지만, 그에 반해 CoreData는 암호화 되며 In-Memory, On-Disk를 선택할 수 있다.
또한 객체 그래프 형태로 관리하기 때문에 많은 양의 데이터들을 관리할 수 있다는 점이 차이점으로 생각된다.



3️⃣ CoreData의 구성요소


CoreData의 구성요소들을 CoreDataStack이라고한다.
그리고 CoreData Stack에는 크게 4가지의 구성요소가 있다.

📌 ManagedObject Model

  • DataBase 내부에 저장되는 타입들이 NSManaged Obejct 타입이다.
    Entity를 설명하는 Database 스키마라고 생각하면된다.
    Managed Objects의 구조를 정의한다.
  • ManagedObject는 ManagedObjectModel을 인스턴스화 한 것이다.

📌 ManagedObjectContext : 관리객체 컨텍스트

  • NSManagedObjectContext는 모든 코어데이터의 활동이 이루어지는 허브 같은 곳이다.
  • Managed Object를 사용하여 CRUD 역할을 수행한다.
    CoreData에서 생성되는 모든 관리 객체(Managed Object)는 컨텍스트에 담겨 관리된다.
  • 코어데이터는 메모리에 로드된 상태로 처리되는데, 이 때의 메모리가 “컨텍스트”를 의미
  • Persistence Coordinator와 함꼐 데이터를 관리하는 매개체 역할을 수행한다.

📌 PersistentStoreCoordinator

  • Persistence Store을 관리하는 객체이고, 실제 데이터를 저장하고 로드하는 작업을 수행한다.
  • Context와 저장소 간의 연결을 담당한다.
  • NSPersistentContainer 인스턴스를 사용하여 모델, 컨텍스트 및 Store Coordinator을 동시에 설정한다.

📌 NSPersistentContainer

  • CoreData Stack을 생성하고 관리하기 위한 Class이다.
  • CoreData Stack을 초기화하는데 필요한 코드를 자동으로 생성해준다.
  • CoreData Stack을 나타내는 필요한 모든 객체를 포함한다.

profile
iOS 자문자답

0개의 댓글