지난 포스팅에서 알아본 UserDefaults, Keychain은 큰 데이터를 저장하기에는 적합하지 않다.

"UserDefaults"는 Memory에 캐싱하기 때문에 메모리 부족으로 이어질 수 있고, 

"Keychain"의 경우에는 Apple에서 민감한 데이터를 위해 제공하기 때문에 적합하지 않다.

 

이번 포스팅에선, 좀 더 큰 데이터를 저장하기 적합한 Core Data에 대해서 알아보자.

 

 

Core Data

 "Core Data"는 Application의 Model Layer의 객체를 관리하는 Framework다.

정확히 말하자면, Core Data는 Database가 아니고, Object Graph Manager이다.

 

Object Graph Manager

Object Graph란, 말 그대로 Object간의 관계이다.

"Core Data"는 이 Object Graph에서 Object들의 Life Cycle을 관리한다.

추가적으로, Object Graph를 디스크에 저장하여 Persistence기능을 이용할 수 있다.

즉, Core Data는 Database가 아니고, 이들이 제공하는 기능 중 하나가 Persistence일 뿐이다. 

 

이외에도 Core Data는 Change Tracking, redo, undo 등 다양한 기능을 제공한다.

 

vs. SQLite

"SQLite"는  서버 없이 모바일 App환경에서 적합한 가벼운 Database이다. 

반면, "Core Data"는 Database가 아닌, Object Graph Manager이다.

 

따라서, 복잡한 Object Relationship이 있다면, "Core Data"를 

아니라면 "SQLite"를 쓰는 것이 적합하다. 

 

 

Core Data Stack

Core Data는 App의 Model Layer를 관리하기 위해 다음과 같은 Class들을 제공한다.

NSManagedObjectModel

NSMangedObjectModel은 ".xcdatamodeld"파일의 Programmatic한 표현이다. 

앞서 "Data Model File"에서 Entity를 정의하게 되면

NSManagedObjectModelNSEntityDescription 객체가 추가된다.

 

NSPersistentStoreCoordinator

Model에 의해 정의된 Object들이 실제로 저장된 Persistence Store을 관리하는 객체이다.

즉, Object Model과 Persistence Store을 연결하는 다리역할을 한다.

 

NSMangedObjectContext

NSManagedObjectContext는 Core Data에서 많은 일을 담당한다. 

Core Data를 통한 CRUD작업시,

Persistent Storage에 바로 접근하지 않고, 이 Context를 거치게 된다. 

 

Git에서 로컬에서 작업한 내용을

이를 원격저장소로 push하기 전까진 원격저장소에 영향을 미치지 않는다. 

 

Context는 이 Git의 로컬 저장소와 같은 역할을 담당한다. 

변경사항은 Persistent Storage에 반영할 때까지, Context의 Memory에 남아 있다.

이러한 Context의 특성을 통해 Validation, redo/undo 등과 같은 기능을 제공한다.

 

NSPersistentContainer

NSPersistentContainer는 위 3개의 Core Data Stack을 추상화시킨 객체이며.

iOS 10이상부터 사용이 가능하다.

 

iOS 10이전에는 Core Data Stack의 객체들을 직접 생성하고 관리해주어야 했지만, 

이제는 Container를 통해 쉽게 생성 및 관리할 수 있게 되었다. 

 

 

Persistent Store Types

Core Data Framework는 4개의 Persistent Store Type을 제공한다.

  • SQLite (Incremental)
  • Binary (Atomic)
  • XML (Atomic)
  • In-Memory (Atomic)

Persistent Storage는 "Atomic Storage"와 "Incremental(Non-Atomic) Storage"로 구분된다.

 

"Atomic Storage"는 읽고 쓰는 작업을 할때, 

이전 상태 즉, 전체 Object Graph를 Memory에 올린 후에 작업을 진행한다.

반면, "Non-Atomic Storage"는 Memory에 필요한 레코드만 올린후 작업을 진행한다.

 

SQLite

Core Data가 default로 사용하는 방법으로,

Non-Atomic한 Persistent Storage이다.

 

앞서 말했듯, 필요한 레코드(프로퍼티)만 Disk에서 Memory로 로드하기 때문에, 

빠르고, Memory공간을 효율적으로 활용할 수 있다.

 

또한, Storage는 Private하기 때문에, SQLite API를 통해 접근 할 수 없다. 

 

Binary

Object Graph들을 Binray 형식으로 저장하며, Atomic Storage이다.

 

XML

Object Graph를 XML형태로 저장하며, Atomic Storage이다. 

iOS환경에선 사용할수 없다.

 

In-Memory

"In-Memory"방식은 메모리에 Object Graph를 저장하는 방식이다. 

실제로 Disk에 저장하지 않기 때문에, 

앱을 종료하거나 디바이스가 종료되면 데이터도 같이 사라지게 된다.

 

References

Apple Documentation

'iOS > iOS' 카테고리의 다른 글

[iOS] Custom Drop Down  (1) 2023.10.31
[iOS] LocalDB(3) - Core Data CRUD  (0) 2023.10.25
[iOS] Local DB(1) - UserDefaults, Keychain  (0) 2023.10.04
[iOS] Infinite Carousel  (0) 2023.07.23
[iOS] Floating Custom TabBarController  (0) 2023.07.22
복사했습니다!