[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/SwiftData & CoreData

[Core Data] Core Data Stack

inu 2022. 6. 9. 14:24
반응형

Core Data Stack

  • Core Data는 4개의 주요 객체로 구성됩니다. 이를 CoreData Stack 이라고 합니다.
    • Persistent Store
      • 데이터를 영구적으로 저장하는 공간으로, 앱을 종료해도 지속적으로 데이터가 저장됩니다.
      • 데이터 종류에 따라 2가지 종류로 나뉘어집니다.
        • Atomic 저장소 : 데이터를 처리하기 위해서는 모든 데이터를 메모리에 로드해야 합니다. (XML, Binary, In-Memory)
        • Non-atomic 저장소 : 필요한 부분만 메모리에 로드합니다. (SQLite)
        • Core Data는 Non-atomic 저장소인 SQLite를 기본 저장소로 사용합니다.
    • Object Model
      • 어떤 데이터들이 저장되며, 해당 데이터들이 어떤 관계를 가지고 있는지 설명하는 객체입니다.
      • 코드를 통해서도 모델을 수정할 수 있지만 주로 Xcode의 모델 편집기를 활용해 수정하게 됩니다.
    • Persistent Store Coordinator
      • 영구 저장소에 저장된 객체를 저장하거나 불러오는 객체입니다.
      • Context에 변경사항을 저장하면 Object Model을 통해 구조를 파악하고 영구저장소에 저장합니다.
    • Managed Object Context
      • Core Data에서 데이터를 생성하면 바로 영구저장소에 저장되는 것이 아니고 이 Context 내부에 임시 데이터로 유지됩니다.
      • Context에게 영구저장을 요청하면 영구적으로 처리됩니다.
        • 반면 저장하지 않을 경우 처리된 모든 데이터가 사라집니다.
      • 영구저장소에서 읽어온 데이터도 Context에서 처리됩니다.
        • 이는 영구저장소 본연의 객체가 아닌 복사본입니다.

Managed Object

  • Core Data에서 영구적으로 저장되는 것은 Entity이지만 실질적으로 Context에서 다루는 것은 Managed Object입니다.
    • Object Model에 정의된 Entity는 NSManagedObject 클래스와 1:1로 연결됩니다.
  • NSManagedObject는 key-value 방식을 통해 속성을 관리할 수 있습니다.
    • 하지만 Swift에서는 이를 이용하기보단 이를 상속한 Entity Class를 사용합니다.
    • Entity Class에서는 직접적으로 속성에 접근하여 수정할 수 있기 때문에 더 용이합니다.

Managed Object Context

  • Core Data를 이해하는데 핵심이 되는 객체입니다.
    • Core Data에서 데이터를 생성하면 바로 영구저장소에 저장되는 것이 아니고 이 Context 내부에 임시 데이터로 유지됩니다.
    • Context에게 영구저장을 요청하면 영구적으로 처리됩니다.
      • 반면 저장하지 않을 경우 처리된 모든 데이터가 사라집니다.
    • 영구저장소에서 읽어온 데이터도 Context에서 처리됩니다.
      • 이는 영구저장소 본연의 객체가 아닌 복사본입니다.
  • 새로운 Managed Object를 생성하면 특정 Context에 등록됩니다.
  • 영구저장소에서 특정 Entity를 불러오면 이에 맞는 Managed Object가 Context에 등록됩니다.
  • Context에서 제공하는 API들은 thread에 안전하지 않기 때문에 동일한 thread에서 호출해야 합니다.
    • 일반적으로는 Blocking이 발생하지 않지만, 큰 작업의 경우 Background Context를 사용합니다.

  • 해당 Context가 생성된 thread에서 작업을 처리하도록 하는 perform 메서드도 제공하기 때문에 이를 활용하여 더 안정적으로 context를 사용할 수 있습니다.
반응형