본문 바로가기

프로젝트/ReminderApp clone

01. CoreData 설계(01)

Reminder 앱을 위한 데이터로는 List와 Reminder가 존재한다.
이번엔 List를 위한 Entity를 설계하고, 이를 앱에서 사용할 수 있도록 Implement 한다.

Entity 이름은 MyList이고, color와 name이라는 Attribute를 갖는다.

color의 타입으로 사용할 UIColor는 CoreData에서 기본적으로 지원하지 않는 타입이기 때문에 직접 지정과 변환을 진행해 줘야 한다.
이를 위해 Codegen 설정을 Manual로 바꿔주고

color attribute의 타입을 Transformable로 설정하고, Transformer와 Custom Class를 직접 지정한다.

//
//  MyList+CoreDataClass.swift
//  ReminderApp
//

import Foundation
import CoreData

@objc(MyList)
public class MyList: NSManagedObject {
    
}

이제 CoreData를 사용할 수 있도록 Implement 해 줘야 한다.
CoreDataClass 파일에서는 CoreData의 MyList Entity를 위한 데이터 모델을 정의한다.

//
//  MyList+CoreDataProperties.swift
//  ReminderApp
//

import Foundation
import CoreData
import UIKit

extension MyList {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<MyList> {
        return NSFetchRequest<MyList>(entityName: "MyList")
    }
    
    @NSManaged public var name: String
    @NSManaged public var color: UIColor
}

extension MyList: Identifiable {
    
}

CoreDataProperties 파일에서는 MyList의 추가적인 속성들과 메서드를 정의한다.
MyList를 검색하기 위한 표준적인 NSFetchRequest를 생성해 반환하고, Entity들의 타입을 지정한다.

//
//  CoreDataProvider.swift
//  ReminderApp
//

import Foundation
import CoreData

class CoreDataProvider {
    static let shared = CoreDataProvider()
    let persistentContainer: NSPersistentContainer
    
    private init() {
        persistentContainer = NSPersistentContainer(name: "ReminderModel")
        persistentContainer.loadPersistentStores { NSEntityDescription, error in
            if let error {
                fatalError("Error initializing ReminderModel \(error)")
            }
        }
    }
}

CoreDataProvider는 실질적인 CoreData를 사용할 수 있도록 하는 class다.
싱글톤 패턴을 사용해 전역으로 공유해 사용할 수 있도록 구현했다.

생성자에서는 persistentContainer를 초기화 하고, 대상 DB를 로드한다.
대상 DB는 "ReminderModel"로 이후에 구현한다.