Core Data에 대해 아라보자 (1) - Modeling Data

Yang Si Yeon·2021년 12월 23일
3

CoreData

목록 보기
1/3

Apple 공식 문서를 보고 정리한 포스팅입니다.


Core Data란?

공식 문서에 나와있는 한 줄 소개는 아래와 같다.

Persist or cache data on a single device, or sync data to multiple devices with CloudKit.

Core Data는 하나의 기기에 데이터를 영구적으로 저장하거나 캐싱 처리할 때 사용할 수 있고, Cloud Kit을 사용해 여러 기기의 데이터를 동기화 할 수 있다.

공식문서에 Core Data는 Framework로 분류되어 있는데, Core Data는 어플리케이션에서 모델 계층의 객체를 관리하는데 사용하는 프레임워크이자, 라이프사이클이나 영속성 관리를 위한 기능을 제공하는 객체 그래프 관리자이다. Database 아님 !

객체 그래프❓


객체를 하나의 노드로 간주하고, 객체 사이의 연관 관계를 링크로 생각하고 이어보면, 그래프 형태의 도형이 만들어진다.

Core Data가 객체 그래프 관리자라는 것은 아래 기능을 알아서 처리해준다는 것으로 볼 수 있겠다.

  • 객체 A와 객체 B를 연결할 수 있으며, 해당 연결은 영속적으로 동기화 된다. (A쪽에서 연결을 변경하면, B가 업데이트되면서 그에 따른 알림을 발생시킨다. 그리고 이 알림에 대해 임의의 코드를 짜 넣어서 실행하는 것이 가능하다.)
  • 한쪽에서 객체를 삭제할 경우 연결된 다른 객체도 삭제할 수 있고, 삭제를 안할 수도 있다.

기능

  1. Persistence
    Core Data 는 저장할 객체를 추상화해서, 데이터베이스를 직접 관리하지 않고도 데이터를 쉽게 저장할 수 있도록 해준다.

  1. Undo and Redo of Individual or Batched Changes
    Core Data의 실행 취소 관리자는 변경사항을 추적하고 개별/그룹/한번에 롤백할 수 있게 해준다. 따라서 앱에 실행 취소 및 다시 실행 기능을 쉽게 추가할 수 있다.

  1. Background Data Tasks
    백그라운드에서 JSON을 객체로 파싱하는 것과 같은 UI-blocking 데이터 작업을 수행한다. 이후 결과를 캐시하거나 저장하여 서버 왕복(roundtrips)을 줄일 수 있다.

  1. View Synchronization
    테이블뷰와 컬렉션뷰에 대한 데이터 원본을 제공하여 view와 데이터를 동기화된 상태로 유지할 수 있게 해준다.

  2. Versioning and Migration
    데이터 모델의 버전을 관리하고 앱이 업데이트됨에 따라 사용자 데이터를 마이그레이션 하는 메커니즘이 포함되어 있다.

언제 사용할까

  1. 오프라인 상태에서도 사용할 수 있도록 앱의 영구적인 데이터를 저장할 때
  2. 데이터를 임시로 캐시할 때
  3. 앱에 실행 취소 기능을 추가할 때


자. 일단 앱의 모델 계층의 객체를 관리하기 위해 Core Data를 쓴다는 것을 알았다.
근데 데이터를 받아와서 저장을 하던 꺼내 쓰던 일단 모델링을 먼저 해야할 것 아니야! 이 포스팅이 주제인 Modeling Data를 시작해보자.

Core Data 모델 만들기 - Createing a Core Data Model

1. 프로젝트에 Core Data 추가하기

먼저 Xcode 프로젝트에 Core Data를 추가해주자. (이 포스팅은 새로운 프로젝트를 만들면서 Core Data를 추가했지만, 이미 만들어진 프로젝트에 추가하고 싶다면 공식 문서 참고하세여)

그럼 평소에는 보이지 않던 .xcdatamodeld 파일이 추가되어 있을 것이다. (이름은 Model로 바꿨음)

2. Entity 구성하기 - Configuring Entities

Entity는 데이터 모델링에서 나온 단어로, 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것이라고 주로 설명한다. 앱 개발자의 관점에서는 쉽게 앱을 구성하는 데이터 그릇이 라고 볼 수 있을 것 같다.

하단에 Add Entity 버튼을 클릭해서 Entity를 만들 수 있고, 왼쪽에서는 생성된 Entity 리스트들을 볼 수 있다. 그리고 오른쪽에서 Data Model inspector를 볼 수 있다.

오른쪽 Data Model inspector를 통해 Entity 구성을 추가적으로 할 수 있는데, 내용은 아래와 같다.

  • Entity Name: 말 그대로 Entity 이름. 이 필드는 Entity 목록(왼쪽 목록)에 표시된 이름을 반영한다.
  • Abstract Entity: 체크박스를 체크하면 해당 Entity의 인스턴스를 생성할 수 없게 된다. (추상 Entity)
  • Parent Entity: Entity에도 당연히 상속이 적용될 수 있어야겠죠? 부모 Entity를 지정할 수 있다.

이 외에 추가적인 사항은 공식문서 참고!

3. Attributes 구성하기 - Configuring Attributes

Attribute는 Entity의 프로퍼티(속성)이다.

아래와 같은 Entity를 만들어보자.

오른쪽에 있는 Data Model Inspector를 통해 Attribute 구성을 추가적으로 할 수 있다.

  • Attribute Type: 말 그대로 Attribute의 데이터 타입. NSAttributeType
  • Optional: Optional Attribute는 저장소에 저장될 때 값을 가질 필요가 없으며, Attribute는 default로 optinal이다. (Swift의 Optional과는 다름)
  • Transient: Transient Attribute는 저장소에 저장되지 않으며, 임시로 값을 저장할 때 유용하다. 앱이 실행되는 동안 해당 데이터의 변화를 추적할 수 있다.
  • Default: 대부분의 데이터 타입이 기본 값을 제공하고, non-optional과 default를 잘 결합하면 성능상의 이점을 기대할 수 있다.
  • Validation: 숫자 타입의 최소값 및 최대값이나 문자열의 정규식 요구 사항과 같은 유효성 검사 규칙을 설정할 수 있다.

이 외에 추가적인 사항은 공식문서 참고!

4. 관계 구성하기 - Configuring Relationships

관계(relationship)로 한 Entity가 다른 Entity에 미치는 영향을 표현할 수 있다. 모든 관계는 역(inverse) 관계로 구성해야한다.

역 관계 ❓
간단히 말해서 누구랑 누구랑 관계 있는지를 쌍방향으로 설정해주면 된다는 뜻 !

해당 그래프에서 articles의 역 관계는 category다.

일단 관계를 추가해보자.

오른쪽 아래에 있는 Editor style 버튼을 눌러 Entity들을 볼 수 있도록 바꾸고, 하나의 Entity에서 다른 Entity로 control-드래그하여 관계 쌍을 만들자.

관계 추가 후 다시 Editor Style 버튼을 눌러 테이블 편집기 스타일로 돌아온 다음 왼쪽 부터 순서대로 관계 이름, 대상, 역 관계(Inverse)를 설정 해주자.

이후 오른쪽 Data Model Inspector에서 Relation 구성을 더 해주자.

우리가 만드려고 하는 Article Entity에는 article이 속한 category(1개)를 나타내는 관계가 필요하고, Category Entity에는 해당 카테고리에 달린 articles(1개 이상)를 나타내는 관계가 필요하다. 따라서 관계 생성 후 Data Model Insepector 에서 Type을 각각 To One, To Many로 설정해줘야 한다.

  • Transient: Transient 관계는 저장소에 저장되지 않으며, 임시로 값을 저장할 때 유용하다. 앱이 실행되는 동안 해당 데이터의 변화를 추적할 수 있다.
  • Optional: Optional 관계는 대상 타입의 인스턴스를 가질 필요가 없다. non-optional 관계는 1개 이상의 대상 타입의 인스턴스를 가리켜야 한다.
  • Inverse: 역관계를 사용하면, 소스나 대상(Destination) 타입의 인스턴스가 변경되었을 때 Core Data가 변경사항을 양방향으로 전파할 수 있다. 따라서 모든 관계에는 역이 있어야 한다.
  • Delete Rule: 해당 관계가 정의된 Entity(source)의 인스턴스가 삭제될 때 변경사항이 다른 관계들에게 전파되는 방식을 정할 수 있다. NSDeleteRule
  • Cardinality Type: 대상 타입의 인스턴스 1개와 연결하려면 To One 관계를 사용. 대상 타입의 집합(Set)과 연결하려면 To Many 관계를 사용.
    Arrangement: 관계에 고유한 순서가 있음을 지정
    Count: 대상 인스턴스 개수의 최소 최대 지정

Cardinality 뜻 ❓
: 집합의 크기

이 외에 추가적인 사항은 공식문서 참고!

5. 코드 생성 - Generating Code

Entity들을 만든 후 Entity의 인스턴스를 만드는 데 사용할 클래스를 생성해줘야 한다.

Core Data는 해당 클래스를 위해 2개의 파일을 생성한다.

class 파일

import Foundation
import CoreData

@objc(Article)
public class Article: NSManagedObject {

}

properties 파일

import Foundation
import CoreData


extension Article {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Article> {
        return NSFetchRequest<Article>(entityName: "Article")
    }

    @NSManaged public var creationDate: Date?
    @NSManaged public var name: String?
    @NSManaged public var viewCount: Int64
    @NSManaged public var category: Category?

}

extension Article : Identifiable {

}

Code Generation Option

Data Model inspector에서 코드 생성 옵션을 선택할 수 있다.

  • Class Definition
    소스 코드 수정이 필요 없으면 해당 옵션을 선택.
    자동으로 class와 properties 파일을 만들어줌. 생성된 소스코드는 프로젝트의 소스 목록에는 나타나지 않고, Xcode는 빌드 프로세스의 일부로 클래스 및 속성 파일을 생성하고, 프로젝트의 빌드 디렉토리에 배치함. 해당 파일들은 관련된 Entity가 바뀔 때 마다 재 생성된다.

  • Category/Extension
    소스 코드에 추가적인 메소드나 비즈니스 로직을 추가하려면 해당 옵션을 선택.
    properties 파일은 자동으로 만들어주고, class 파일은 완전히 제어할 수 있음. 수동으로 클래스를 만들고 관리하는 것은 개발자에게 달려있다.

  • Manual/None
    class 파일과 properties 파일 둘 다 수정하고 싶으면 해당 옵션을 선택.
    이 옵션을 사용하면 Core Data는 managed object를 지원하는 파일을 생성하지 않는다. class와 properties 파일을 직접 만들고 관리해야한다. 이후 Core Data는 클래스 이름 및 module fileds을 보고 파일을 찾는다.

class 파일, properties 파일 만드는 법
1) Xcode 메뉴바 > Editor > Create NSManagedObject Subclass 선택
2) class 파일을 생성할 Entity 선택
3) 이때 Xcode는 class 파일과 properties 파일을 둘 다 생성하는데, Category/Extension 옵션일 때는 properties 파일을 자동으로 생성해주므로, 삭제해야한다.

참고

https://ios-development.tistory.com/89
https://sihyungyou.github.io/iOS-coredata/

profile
가장 젊은 지금, 내가 성장하는 데에 쓰자

0개의 댓글