Apple 공식 문서를 보고 정리한 포스팅입니다.
공식 문서에 나와있는 한 줄 소개는 아래와 같다.
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가 객체 그래프 관리자라는 것은 아래 기능을 알아서 처리해준다는 것으로 볼 수 있겠다.
View Synchronization
테이블뷰와 컬렉션뷰에 대한 데이터 원본을 제공하여 view와 데이터를 동기화된 상태로 유지할 수 있게 해준다.
Versioning and Migration
데이터 모델의 버전을 관리하고 앱이 업데이트됨에 따라 사용자 데이터를 마이그레이션 하는 메커니즘이 포함되어 있다.
자. 일단 앱의 모델 계층의 객체를 관리하기 위해 Core Data를 쓴다는 것을 알았다.
근데 데이터를 받아와서 저장을 하던 꺼내 쓰던 일단 모델링을 먼저 해야할 것 아니야! 이 포스팅이 주제인 Modeling Data를 시작해보자.
먼저 Xcode 프로젝트에 Core Data를 추가해주자. (이 포스팅은 새로운 프로젝트를 만들면서 Core Data를 추가했지만, 이미 만들어진 프로젝트에 추가하고 싶다면 공식 문서 참고하세여)
그럼 평소에는 보이지 않던 .xcdatamodeld 파일이 추가되어 있을 것이다. (이름은 Model로 바꿨음)
Entity는 데이터 모델링에서 나온 단어로, 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것이라고 주로 설명한다. 앱 개발자의 관점에서는 쉽게 앱을 구성하는 데이터 그릇이 라고 볼 수 있을 것 같다.
하단에 Add Entity 버튼을 클릭해서 Entity를 만들 수 있고, 왼쪽에서는 생성된 Entity 리스트들을 볼 수 있다. 그리고 오른쪽에서 Data Model inspector를 볼 수 있다.
오른쪽 Data Model inspector를 통해 Entity 구성을 추가적으로 할 수 있는데, 내용은 아래와 같다.
이 외에 추가적인 사항은 공식문서 참고!
Attribute는 Entity의 프로퍼티(속성)이다.
아래와 같은 Entity를 만들어보자.
오른쪽에 있는 Data Model Inspector를 통해 Attribute 구성을 추가적으로 할 수 있다.
이 외에 추가적인 사항은 공식문서 참고!
관계(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로 설정해줘야 한다.
Cardinality 뜻 ❓
: 집합의 크기
이 외에 추가적인 사항은 공식문서 참고!
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 {
}
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/