본문 바로가기
iOS/설명

[iOS] CoreData - (2)

by Sky Titan 2022. 2. 5.
728x90

※출처 - 꼼꼼한 재은씨의 Swift: 실전편

 

싸니까 믿으니까 인터파크도서

제대로 스위프트를 즐기는 방법 이 책은 전반적으로 하나의 메인 프로젝트를 완성해나가는 동시에 각 주제별로 소규모 앱을 만들면서 기능을 익히도록 구성되어 있습니다. 따라서 특정 주제나

book.interpark.com

코어 데이터 이해하기

  • 코어 데이터는 여러 계층에서 서로 협력하는 다양한 객체들로 이루어져 있다.

 

객체 그래프 관리자(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)

  • 코어 데이터에서 가장 핵심적인 객체로 크게 두 가지 역할을 담당한다.
    1. 관리 객체를 담거나 생성, 삭제하는 Box의 역할
      • 컨텍스트를 통해서 새로운 관리 객체를 생성, 혹은 기존에 있는 관리 객체를 삭제 할 수 있다.
      • 컨텍스트에 담긴 모든 관리 객체를 영구 저장소로 보내 저장할 수도 있다.
      • , 데이터를 읽고 쓰고 하는 작업은 모두 컨텍스트를 통해 이루어진다.
      • 코어 데이터는 모든 데이터를 메모리에 로드한 상태에서 처리한다고 했는데 이 때의 메모리가 컨텍스트를 의미한다.
    2. 영구 저장소 및 영구 저장소 코디네이터에 대한 관리자
      • 우리는 컨텍스트 객체의 특정 메소드를 호출하는 것만으로 데이터를 읽거나 쓰는 것이 가능하다.
      • 하지만 실질적인 읽기, 쓰기 작업은 영구 저장소 코디네이터에서 처리하는 데 이것에 대한 관리를 담당한다.

 

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

댓글