스닥
Playground
스닥
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • 개발자 기본기 (1)
    • Swift 아키텍처 (6)
    • iOS 개발 (55)
      • Swift (12)
      • UIKit (17)
      • SwiftUI (9)
      • CoreData (9)
      • MusicKit (4)
      • WebKit (2)
      • 개발 환경 (0)
      • WatchOS (2)
    • 애플 개발자 아카데미 (4)
    • 막 쓰는 개발일지 (0)
    • 운영체제 (4)
    • 네트워크, 서버 (16)
      • Network (9)
      • Server (7)
    • 알고리즘 (8)
    • C언어 (7)
      • 함수 (7)
    • 하루 이야기 (23)

블로그 메뉴

  • GitHub계정
  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 트리
  • 문자열 복사
  • struct class 성능
  • C 언어
  • BFS
  • 서버
  • 알고리즘
  • 자료구조
  • swift performance
  • 너비 우선
  • docker
  • Server
  • core data
  • SWIFT
  • 도커
  • ios rendering
  • dfs
  • ip주소
  • Core Animation
  • 깊이 우선

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
스닥

Playground

[Core Data] Entity Class 설정 - Codegen option 탐구
iOS 개발/CoreData

[Core Data] Entity Class 설정 - Codegen option 탐구

2021. 9. 3. 14:07

 

 

 

 

우리가 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
    스닥
    스닥
    https://github.com/feldblume5263

    티스토리툴바