[iOS] Core Data 에 대해

nnnyeong·2022년 4월 12일
0

iOS

목록 보기
11/17
post-thumbnail
post-custom-banner

인턴십 과정중 local data 사용 방식으로 선택한 Core Data 에 대해 다시 공부하고 정리 해 보았다!




Core Data 란

코어데이터는 데이터 베이스가 아니다. 코어데이터는 애플의 local object graph persistence framework 로, 로컬 디바이스에 데이터를 저장하는 목적으로 사용되는 프레임워크이다.




Core Data 가 하는 일

공식문서에 따르면 코어데이터가 하는 일은 크게 5가지로 나와있다.

Persistence(영속성)

  • Core Data는 객체를 저장소에 매핑하는 세부 정보를 추상화하여 DB를 직접 관리하지 않고도 Swift 데이터를 쉽게 저장할 수 있도록 한다.

코어 데이터를 사용해서 앱에서 사용되는 데이터를 저장하고, 불러오고, 수정하는 과정에서 개발자는 직접 해당 데이터들의 관계를 관리하거나 생각할 필요가 없다. DB 에 대한 생각을 할 필요 없이 데이터를 저장하고, 수정하고, 불러오거나 삭제할 수 있도록 한다.

개별, 일괄 변경 사항 Undo, Redo

관리자는 변경 사항을 추적하고 개별적으로나 그룹적으로 한 번에 롤백할 수 있어 앱에 Undo 및 Redo를 쉽게 추가할 수 있다. 아이폰에서 메모나 메시지를 쓰다가 흔들면 글자가 사라지는 기능이 있는데요, 아래 그림은 그러한 제스처를 사용하여 실행 취소를 하는 것을 보여주는 그림이다.

백그라운드 데이터 작업

백그라운드에서 JSON을 객체로 구문 분석하는 것과 같은 데이터 작업을 수행한다. 그런 뒤 결과를 캐시 하거나 저장하여 서버에 갔다 오는 횟수를 줄일 수 있다. 아래 그림은 UI를 업데이트하기 전에 백그라운드에서 개체를 채우는 End Point의 데이터를 보여주는 그림이다.

동기화

Core Data는 테이블, 컬렉션 뷰에 대한 Data Source를 제공하여 뷰와 데이터를 동기화 상태로 유지하는데 도움을 준다.

버전 관리 및 Migration

Core Data에는 데이터 모델의 버전을 관리하고 앱이 발전함에 따라 사용자 데이터를 마이그레이션하는 메커니즘이 있다.




Core Data 의 구조

관리 객체 (Managed Object), 관리 객체 모델 (Managed Object Model)

관리 객체 모델 (Managed Object Model)은 database의 스키마를 의미한다. 관리 객체의 구조, 엔터티(Entity)의 구조를 정의하는 객체이다. 이를 바탕으로 생성된 인스턴스가 관리 객체(Managed Object) 이다.


관리 객체 컨텍스트 (Managed Object Context)

컨텍스트는 transaction 을 담당한다고 이해할 수 있다. 관리 객체를 생성, 저장하고 가져오는 작업등을 제공한다.

  • MO를 가지고 CRUD역할 (Core Data에서 생성되는 모든 관리 객체는 컨텍스트에 담겨 관리됨)

    • 컨텍스트에 담긴 객체는 영구 저장소로 보내 저장, 삭제될 수 있다.
    • 코어데이터는 메모리에 로드된 상태로 처리되는데, 이 때의 메모리가 "컨텍스트"를 의미한다.
  • 영구 저장소영구 저장소 코디네이터에 대한 관리자 역할

    • 읽기와 쓰기를 영구 저장소에 요청한다.

영구 저장소 코디네이터(Persistent Store Coordinator)

영구 저장소와 관리 객체 모델을 연결한다. 컨텍스트와 직접 데이터를 주고 받으며 영구 저장소들의 접근을 조정하고 입출력을 담당한다.


Core Data 활용 흐름

위와 같은 Core Data 구조를 바탕으로 엔티티 저장 흐름을 간단히 설명하자면 아래와 같다.

  • NSManagedObjectContext 를 가져옴
  • 저장하려하는 entity 를 가져옴
  • NSManagedObject를 만들고 값을 세팅
  • NSManagedObjectContext 를 저장한다.



Core Data 의 단점

  • In-Memory 방식
    • 데이터를 삭제하고자 할 때 영구저장소에서 데이터 읽어오고 -> 객체로 생성 -> 이것을 메모리에 로드 -> 이를 삭제하고 다시 컨텍스트를 저장소에 커밋 하는 과정이 필요
  • Unique Key 가 없음
    • 중복된 값의 입력을 방지하는 Unique Key 가 없으므로, 애플리케이션에서 비즈니스 로직을 통해 처리해야 함
  • Thread - Safe 하지 않음
    • 멀티 스레드 환경에서 스레드 사이의 lock 기능이 존재하지 않음
profile
주니어 개발자까지 ☄️☄️
post-custom-banner

0개의 댓글