
우리가 Core Data를 처음 마주하여 Entity를 생성하면, 이 Entity(Class)에 대해 Name과 Module과 Codegen을 설정해야 한다.
Class Name은 Entity를 Class로 다룰 때 사용할 이름으로 어렵지 않았지만,
Module과 Codegen은 그냥 봐서는 잘 이해가 가지 않았다.
마찬가지로 어려움을 느끼는 사람들이 있을 것 같아서 이 블로그 글을 작성하게 되었다.
1. Entity Class 설정

먼저 Entity는 Core Data가 관리하는 객체를 의미한다. 우리가 일반 코드를 다룰 때 이용하는 Class, DB를 다룰 때 이용하는 Table과 개념이 비슷하다.
Entity를 생성한 후에는 새로 만들어진 Entity를 어떻게 사용할 건지 설정해 주어야 한다.
먼저 Name을 통해, 우리가 직관적으로 이해할 수 있는 Class Name을 설정한다. 이미 우리는 Entity Name을 설정해 주었을 테니, Class Name은 굳이 따로 수정해 줄 필요가 없을 것이다. 만약에 Class Name을 바꾸고 싶다면 자유롭게 바꾸어도 된다. 하지만 이는 Entity Name에는 영향을 주지 않는다.
2. Module은 무엇일까? 먼저 간단하게 알아보자
그렇다면 이 밑에 Module은 무엇일까? Module 항목에서는 우리가 새로 만든 Entity를 Class로 선언할 때, 이 Class가 어떤 Module에 존재할 지를 정해준다.

맨 처음에는 Global namespace로 되어 있을 텐데, 보통은 Current Product Module로 수정해준다.
간단한 작업을 할 경우에는 이렇게 그대로 두어도 상관 없지만, 우리의 프로젝트가 복잡해지고 특히 어플리케이션이 Multi-threading을 사용하게 되면, Module을 지정해주지 않으면 오류가 생길 수 있다고 한다.
자 이제 Codegen 파트에 대해서 알아보자
3. 우리가 궁금했던 부분! Codegen 이란 무엇일까
Codegen은 Entity에 대한 Class 선언을 자동으로 만들어주는 옵션을 설정하게 해준다.
하지만 이렇게 이야기해서는 무슨말인지 하나도 알 수 없을 것이다.
이게 무슨말인지 이해하기 위해서 하나씩 항목을 살펴보면서 알아보자.

1. Class Definition
Codegen 항목을 처음 보게 되면, Class Definition으로 설정되어 있다. 이 설정은 우리의 Data, Entities, Attributes 들을 자동으로 Class화 시켜주고 Property화 시켜주는 역할을 한다. 이를 통해 우리는이 설정을 통해 관련된 파일을 추가하지 않고도 Entity를 이용하거나 조작할 수 있다.
그렇다면 도대체 무슨 관련된 파일을 만들어준다는 것일까?
일단 만들어진 파일은 다음 디렉토리에 대해서 확인할 수 있다.
/Users/Feldblume/Library/Developer/Xcode/DerivedData/CoreDataTest-fiyyuhcmbmdkrsgubzbgmaaeyqtf/Build/Intermediates.noindex/CoreDataTest.build/Debug-iphonesimulator/CoreDataTest.build/DerivedSources/CoreDataGenerated/DataModel
Feldblume는 내 User Name이다. 내 프로젝트 이름은 CoreDataTest 이고, 데이터 모델의 이름은 DataModel 이다. 이것을 참고해서 자신의 프로젝트에 따라서 해당 디렉토리에 접근해보자.
확인해보면, 다음과 같이 Entity의 Class와 Properties 파일이 자동으로 만들어져 있는 것을 확인할 수 있다!!

먼저 Class 파일은 간단하다. Class 파일은 생성되면 Xcode에 의해서 수정되지 않는다.
import Foundation
import CoreData
public class MyData: NSManagedObject {
}
반면에 Properties 파일은 Xcode의 필요에 따라 끊임없이 재생성 된다.
import Foundation
import CoreData
extension MyData {
@nonobjc public class func fetchRequest() -> NSFetchRequest<MyData> {
return NSFetchRequest<MyData>(entityName: "MyData")
}
@NSManaged public var done: Bool
@NSManaged public var title: String?
}
extension MyData : Identifiable {
}
이 말은 즉슨 우리가 필요에 따라 이 코드에 무언가를 수정하거나 추가를 해도, 어느 순간 Xcode에 의해 초기화 되어버릴 수 있다는 말이다.
(아직 내 레벨에서 이 부분을 코드로 수정할 일은 없을 것 같지만...)
만약에 우리의 코드를 통해 저 파일들을 제어하기를 바란다면 우리는 세번째 옵션인 Category/Extension을 선택해야 한다.
2. Category/Extension
우리의 코드를 통해 저 파일들을 제어하기를 바란다면 우리는 세번째 옵션인 Category/Extension 을 선택해야 한다.
우리가 이 옵션을 선택하게 되면, 우리는 우리 스스로 우리의 Entity들의 이름으로 Class들을 직접 생성해야 한다. 그러면 Xcode가 자동으로 연결을 해주게 된다.
3. Manual/None
이 옵션은 아무런 코드를 생성하지 않겠다는 뜻이다.
"어떠한 자동적인 연결도 필요없고 모든 것을 개발자 나 혼자서 다 해서 내가 알아서 사용하겠다" 라는 뜻이다.

엄청난 패기가 느껴지는 옵션이다... 언젠가는 나도 이 옵션을 선택해서 프로젝트를 진행할 날이 오겠지?
4. 코드 살펴보기
import Foundation
import CoreData
public class MyData: NSManagedObject {
}
MyData 클래스는 NSManagedObject를 상속받는다. NSManagedObject는 CoreData를 통해 이 클래스를 관리할 수 있도록 해준다.
5. 마무리
가장 많이 사용하는 옵션은 아무래도 Class Definition 옵션 이고, 현업에서는 코드 추가를 위해서 Category/Extension 옵션 도 많이 사용한다고 한다.
사실 거창하게 여러가지를 이야기했지만, Class Definition 옵션이 해주는 역할과 한계만 명확하게 이해한다면 왜 이런 옵션이 존재하는지를 이해할 수 있을 것이다.
'iOS 개발 > CoreData' 카테고리의 다른 글
[CoreData] Relationship을 통해 Data를 관리하기 (0) | 2022.01.06 |
---|---|
[CoreData] Coredata 자체를 sort 할 수 있을까? (0) | 2021.11.17 |
[Core Data] Context를 이용해 Entity에 Attributes들을 추가, 삭제 (0) | 2021.09.08 |
[Core Data] Entity의 Name Attribute들을 Cell에 표시하기 (0) | 2021.09.07 |
[Core Data] TableView와 Navgation Cotroller을 임베디드 하기 (0) | 2021.09.07 |
[Core Data] Entity와 Attribute를 생성하는 방법 (0) | 2021.09.07 |
[Core Data] Context란? (0) | 2021.09.06 |
[애플 Document 번역] Core Data (0) | 2021.08.27 |