오늘은 Swift의 Core Data에 대해서 알아보려고 합니다!
CoreData란?
앱의 영속적인 데이터를 저장
임시 데이터를 캐싱
단일 장치에서 앱에 undo 기능을 추가할 수 있도록 함
간단히 말해서 Core Data는 로컬 데이터를 저장할 수 있는 공간(Like SQLite)이라고 생각하면 편할 것 같습니다!
(엄밀히 말하면 DB는 아니고 애플에서는 Object Graph 라고 하지만요!)
Persistence(영속성)?
CoreData는 객체를 저장소에 매핑하는 세부 정보를 추상화 합니다.
이는 데이터베이스를 직접 관리하지 않고 Swift, Objective-C에서 데이터를 쉽게 저장할 수 있도록 합니다.
Core Data Stack
NSPersistentContainer
앱의 코어 데이터 스택을 캡슐화한 컨테이너입니다.
NSManagedObjectModel
앱의 유형, 속성 및 관계를 설명하는 앱의 모델 파일을 나타냅니다.
앱에서 사용하는 Data model과, Data model이 가질 수 있는 properties, relationship을 나타낸다고 할 수 있습니다.
NSManagedObjectContext
관리되는 개체의 변경 사항을 추적하고 처리할 수 있는 개체입니다.
NSPersistentStoreCoordinator
저장소로부터 앱의 유형에 따른 개체들을 저장하고 패치해올 수 있는 개체입니다.
앱의 컨텍스트와 기본 영구 저장소(underlying persistent store)가 함께 작동할 수 있도록 하는 개체입니다.
Context
여기서 말하는 Context는 위에서 말하는 NSManagedObjectContext를 의미합니다!
이번 글을 쓴 이유인데, 다른 곳에서 Core Data 기초나, Core Data 스택이 뭔지 등등은 잘 나와있는데, Context는 정의하는데 잘 이해가 안가더라구요! 그래서 정리할 겸 간단하게 얘는 어떤 역할을 하는지 적어보고자 합니다.
NSManagedObjectContext는 메모리를 사용하는 작업 공간이며, CRUD 작업을 수행하고, 변경 사항을 로컬 메모리에서 관리합니다.
자 여기서 메모리를 사용하는 작업 공간이라고 했잖아요?
보통 context를 사용할 때는 싱글톤 객체를 사용해서 전역적으로 1개를 사용하는 것 같더라구요. 하지만 context를 여러 개 만들 수도 있다는거! 그러나 이 context들은 각각의 in mamory를 가지고 있어서 context.save()를 하기 전까지는 Persistent Storage에 반영되지 않고 자기가 가지고 있는 메모리에서만 존재하게 됩니다!
그렇기 때문에 undo나 redo가 가능하게 되는거구요 ㅎㅎ
마치 snapshot으로 git을 관리하는 것처럼 특정 시점의 데이터를 저장하는거죠!
이러한 특성 때문에 조심해야하는 것은 context간 데이터 불일치 문제가 존재합니다!
예를 들어 contextA, ContextB가 존재한다고 합시다.
public class MessageEntity: NSManagedObject {
var content: String
}
뭐 이런 엔티티가 코어 데이터에 있다고 하면
1. contextA가 content = "Hi" 라고 수정
2. contextB가 content = "Bye" 라고 수정
3. contextA를 save
4. contextB를 save
위 결과는 어떨 것 같나요?
3에서 save했던 Hi가 Bye로 덮혀씌워져서 저장되어 데이터의 불일치 문제가 발생하게 될 것입니다!
그래서 이러한 문제때문에 보통 싱글톤으로 관리하는 것 같다는 생각이 드네요!
'Swift' 카테고리의 다른 글
[Swift] 함수형 프로그래밍과 Closure(클로저) (0) | 2024.12.13 |
---|---|
[Swift] 비동기와 async/await (0) | 2024.12.13 |
Electron 앱과 Swift Native 앱간 통신하기 (0) | 2024.09.04 |
[Swift] 서브스크립트(subscript)에 대해 알아보자! (0) | 2024.08.23 |
[Swift] Struct vs Class (0) | 2024.08.22 |