๐Ÿ“‘ Project

[ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #3

EarthSea 2024. 3. 22. 19:45

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”โœจ

์˜ค๋Š˜์€ ์ œ๊ฐ€ ๋งŒ๋“  Todo List Project๋“ค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๋œฏ์–ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

[ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #2์—์„œ ๊ตฌํ˜„ํ•œ ๋ฐ์ดํ„ฐ๋“ค์— CoreData๋ฅผ ์ ์šฉํ•˜์˜€์–ด์š”!

 

[ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #2

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ’š ์–ด์ œ๋Š” todolist๋ฅผ ๋ณด์—ฌ์ค„ ํ…Œ์ด๋ธ”๋ทฐ๊ณผ todolist์˜ ์™„๋ฃŒ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ฒดํฌ ๋ฐ•์Šค ๋ฒ„ํŠผ์„ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ์š”. [ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #1 [ Project ] todoList ๊ตฌํ˜„ํ•˜๊ธฐ #1 ์•ˆ๋…•ํ•˜์„ธ์š”! ์ด๋ฒˆ

jihae-qu.tistory.com

 

CoreData๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋งํฌ๋ฅผ ํƒ€๊ณ ๊ฐ€ ๋ณด๊ณ  ์˜ค์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

[ TIL ] ์ค‘์š”ํ•œ ๊ฑด ๊บพ์˜€๋Š”๋ฐ๋„ ๊ทธ๋ƒฅ ํ•˜๋Š” ๋งˆ์Œ / ์ฝ”์–ด๋ฐ์ดํ„ฐ / 24๋…„ 3์›” 20์ผ

์•ˆ๋ƒฅํ•˜์„ธ์š”! ์˜ค๋Š˜๋„ ์–ด๊น€์—†์ด TIL์„ ์“ฐ๋Ÿฌ ์˜จ ์ €์˜ˆ์š”๐Ÿ˜ ํ›„.. ์˜ค๋Š˜์€ "์ฝ”์–ด๋ฐ์ดํ„ฐ" ์นœ๊ตฌ๋ž‘ ํ•œ ํŒ ๋ถ™์—ˆ๋Š”๋ฐ์š”?! ๊ทธ๋ƒฅ ์ ธ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค...ใ…‹ ๊ทธ๋ž˜๋„ ๊ณ„์† ์‹ธ์›Œ๋ด์•ผ์ฃ ..! ์ค‘์š”ํ•œ๊ฑด ๊บพ์˜€๋Š”๋ฐ๋„ ๊ทธ๋ƒฅ ํ•˜๋Š” ๋งˆ

jihae-qu.tistory.com

 

 

CoreData ๋„์‹ํ™”

ํ˜„์žฌ ์ œ๊ฐ€ ์ƒ์„ฑํ•œ TodoData๋ฅผ ๋„์‹ํ™” ์‹œํ‚จ ํ‘œ์ž…๋‹ˆ๋‹ค. ์ •๋ง ๋ณผ์ž˜ ๊ฒƒ ์—†์ด ๊ทธ๋ ธ๋‹ค๋งŒใ…‹ใ…‹..

 

 

๊ทธ๋ฆผ์˜ ์˜ค๋ฅธ์ชฝ ํ‘œ์ฒ˜๋Ÿผ ์ œ๊ฐ€ todoData๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ €๋Ÿฐ ํ‘œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋˜์–ด์žˆ์„ ๊ฑฐ์—์š”! ๊ทธ๋Ÿผ ์ด ๋ฐ์ดํ„ฐ๋“ค์„ ์–ดํ”Œ๋กœ ๊ฐ€์ง€๊ณ ์™€์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฐฉ๋ฒ•์„ ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

 

 

CoreData ์‚ฌ์šฉ๋ฐฉ๋ฒ•

์šฐ์„  CoreData๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” coredata ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ import๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import CoreData

๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์„ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋”ฉ์„ ์งค๋•Œ๋Š” Data๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” DataManager ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์‹ค๊ฑฐ์—์š”!
CoreData๋„ ์ด DataManager ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ €๋Š” Singleton ๋””์ž์ธ ํŒจํ„ด์„ ๋”ฐ๋ผ ์•ฑ์„ ๊ตฌํ˜„ํ•˜์˜€์–ด์š”! ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹คโœจ. DataManager ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ DataManager ํ•จ์ˆ˜๋“ค์— ์ ‘๊ทผ์„ ํ•ด์•ผ๊ฒ ์ฃ ?! ์ €๋Š” ์—ฌ๊ธฐ์„œ Singleton ํŒจํ„ด์— ๋”ฐ๋ผ ๋”ฑ ํ•œ๋ฒˆ๋งŒ DataManager ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 static let shared = ListDataManager()

์œ„์˜ ์ฝ”๋“œ๋Š” static์œผ๋กœ ์„ ์–ธ๋œ shared ๋ผ๋Š” ๋ณ€์ˆ˜์— DataManager์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์ธ์Šคํ„ด์Šคํ™”ํ•œ๋‹ค๋Š” ๊ทธ ๋ณ€์ˆ˜๊ฐ€ shared๊ฐ€ ๋˜๊ฒ ๋„ค์š”! ์ด shared๋Š” ์•ฑ์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋‹ค์Œ ์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

// ์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ
let appDelegate = UIApplication.shared.delegate as? AppDelegate

App Delegate๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฐ์ฒด์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” CoreData๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ context๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์–ด์š”!

// ์ž„์‹œ์ €์žฅ์†Œ
lazy var context = appDelegate?.persistentContainer.viewContext

์—ฌ๊ธฐ์„œ persistentContainer ๋Š” CoreData์˜ ์Šคํƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, viewContext๋Š” CoreData์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ Main Context๋ผ๊ณ  ๋ณด์‹œ๋ฉด๋ผ์š”!

 

 

์–ด์จŒ๋“  ์ด ๊ณผ์ •์€ CoreData์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋˜๋Š”๋ฐ์š”! Class ๊ตฌ์กฐ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•ด์žˆ์œผ๋ฉด ๋งˆ์Œ์ด ๋“ ๋“ ํ•ฉ๋‹ˆ๋‹ค!

๋˜ ๊ณ„์† ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ์ด๋ฆ„๋„ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ €์žฅํ•ด๋ฒ„๋ฆด๊ฒŒ์š”.

// ์—”ํ„ฐํ‹ฐ ์ด๋ฆ„ (์ฝ”์–ด ๋ฐ์ดํ„ฐ์— ์ €์žฅ๋œ ๊ฐ์ฒด)
let modelName: String = "TodoData"

 

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์™„์„ฑ์ด ๋ฉ๋‹ˆ๋‹ค.

class ListDataManager {
    
    
    // ๋ฐ์ดํ„ฐ ๋งค๋‹ˆ์ €
    static let shared = ListDataManager()
    private init() {}
    
    
    // ์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    
    
    // ์ž„์‹œ์ €์žฅ์†Œ
    lazy var context = appDelegate?.persistentContainer.viewContext
    
    
    // ์—”ํ„ฐํ‹ฐ ์ด๋ฆ„ (์ฝ”์–ด ๋ฐ์ดํ„ฐ์— ์ €์žฅ๋œ ๊ฐ์ฒด)
    let modelName: String = "TodoData"

}

 

 

 

Create

์ด์ œ ์ฝ”์–ด๋ฐ์ดํ„ฐ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ์งœ๋ณผ๊นŒ์š”?

// TodoData๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ
    func createTodoData(title: String, date: Date) {
        guard let context = context,
              let entity = NSEntityDescription.entity(forEntityName: modelName, in: context) else {
            return
        }
        
        // NSManagedObject ์ƒ์„ฑ
        let newTodoData = NSManagedObject(entity: entity, insertInto: context)
        
        // ์†์„ฑ ๊ฐ’ ์„ค์ •
        newTodoData.setValue(title, forKey: "title")
        newTodoData.setValue(date, forKey: "date")
        
        // ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ €์žฅ
        do {
            try context.save()
            print("TodoData created successfully!")
        } catch {
            print("Error creating TodoData: \(error)")
        }
    }

 

- guard let context = context, let entity = NSEntityDescription.entity(forEntityName: modelName, in: context) else  { return }
: ์ฝ”์–ด ๋ฐ์ดํ„ฐ ๋‚ด์—์„œ๋„ ํ•œ ๊ฐ€์ง€์˜ Entity๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ Entity๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ํŠน์ • Entity๋ฅผ ๊ฐ€์ ธ์˜ด.


- let newTodoData = NSManagedObject(entity: entity, insertInto: context)
: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  NSManagedObject ์ƒ์„ฑ


- newTodoData.setValue(title, forKey: "title"); newTodoData.setValue(date, forKey: "date")
: ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ์š”์†Œ๋ฅผ ์ •ํ•ด์คŒ.


- context.save() 
: ๋ฐ์ดํ„ฐ ์ €์žฅ

 

 

 

Read

์ด๋ฏธ ์ฝ”์–ด๋ฐ์ดํ„ฐ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

func getTodoListCoreData(forDate date: Date) -> [TodoData] {
    var todoList = [TodoData]()
    
    guard let context = context else {
        return todoList
    }
    
    let fetchRequest: NSFetchRequest<TodoData> = TodoData.fetchRequest()
    
    let predicate = NSPredicate(format: "date == %@", date as NSDate)
    fetchRequest.predicate = predicate
    
    let sortDescriptor = NSSortDescriptor(key: "priority", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]
    
    do {
        todoList = try context.fetch(fetchRequest)
    } catch {
        print("Error fetching todo list data: \(error)")
    }
    
    return todoList
}

 

- var todoList = [TodoData]()
: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ €์žฅํ•ด๋‘˜ ๋ฐฐ์—ด

- guard let context = context else { return todoList }
: ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ž„์‹œ์ €์žฅ์†Œ context๋ฅผ unwrappingํ•˜๋Š” ๊ณผ์ •

- let fetchRequest: NSFetchRequest<TodoData> = TodoData.fetchRequest()
: ๋‚ด๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์š”์ฒญ์„œ๊ตฌํ˜„

- let predicate = NSPredicate(format: "date == %@", date as NSDate); fetchRequest.predicate = predicate
: ๋‚ด๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์กฐ๊ฑด์„ ๋‹ด์€ ๋ณ€์ˆ˜๋ฅผ ์š”์ฒญ์„œ์— ์ถ”๊ฐ€

- let sortDescriptor = NSSortDescriptor(key: "priority", ascending: true); fetchRequest.sortDescriptors = [sortDescriptor]
: ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ์ •๋ ฌ๋กœ ๋ฐ›์„ ์ง€๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜๋ฅผ ์š”์ฒญ์„œ์— ์ถ”๊ฐ€

- todoList = try context.fetch(fetchRequest)
: ์ž„์‹œ์ €์žฅ์†Œ์—๊ฒŒ ์š”์ฒญ์„œ๋ฅผ ๋ณด๋‚ด์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ todoList ๋ฐฐ์—ด์— ์ €์žฅ

 

์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด์ž๋ฉด ์ž„์‹œ์ €์žฅ์†Œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š”์ง€ ๋˜‘๋˜‘ ํ™•์ธํ•œ ๋‹ค์Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๋ฉด ์š”์ฒญ์„œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฑฐ์ฃ . ๊ทธ ์š”์ฒญ์„œ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋ชจ์–‘์œผ๋กœ ๋‹ด์•„์˜ฌ ๊ฒƒ์ธ์ง€๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์–ด์š”. ์š”์ฒญ์„œ๋ฅผ ๋‹ค ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์ž„์‹œ์ €์žฅ์†Œํ•œํ…Œ ์š”์ฒญ์„œ๋ฅผ ๋ณด๋‚ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ฌ๋ผ๊ณ  ํ•˜๋Š” ๊ฑฐ์ฃ . ์ž„์‹œ์ €์žฅ์†Œ๊ฐ€ ์š”์ฒญ์„œ๋ฅผ ๋‚ด์ฃผ์—ˆ๋‹ค๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์›๋ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

 

 

Delete

๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์–ด์š”! ํ•จ๊ป˜ ์ฝ”๋“œ๋ฅผ ์งœ๋ด…์‹œ๋‹ค!

func deleteTodoData(_ todoData: TodoData) {
    guard let context = context else {
        return
    }
    
    context.delete(todoData)
    
    do {
        try context.save()
    } catch {
        print("Error deleting todo data: \(error)")
    }
}

์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•ด์กŒ์ฃ ?! ๋ฐ์ดํ„ฐ์˜ ์กฐ๊ฑด๋“ค์„ ๋‹ฌ์•„์„œ ์š”์ฒญ์„œ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์‚ญ์ œํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ์ •์ด ์•„์ฃผ ๊ฐ„๊ฒฐํ•ด์ง‘๋‹ˆ๋‹ค.

 

- context.delete(todoData)
: ๋‚ด๊ฐ€ ๊ฐ€์ง„ todoData๋ฅผ ์‚ญ์ œ

- context.save()
: ์ž„์‹œ์ €์žฅ์†Œ ์ €์žฅ

 

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์œผ๋‹ˆ ๊ผญ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Update

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฝ”๋“œ๋„ ์งœ๋ด…์‹œ๋‹ค.

์•ฑ์„ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ๋ฐ์ดํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ”๊ฟ”์•ผํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. title์„ ๋ฐ”๊พผ๋‹ค๋˜์ง€ date๋ฅผ ๋ฐ”๊พผ๋‹ค๋˜์ง€ ๊ทธ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ๋“ค๋„ ๋‹ค ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๊ธฐ๋ณธ์ ์œผ๋กœ title์„ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋ด…์‹œ๋‹ค.

func updateTodoDataTitle(_ todoData: TodoData, newTitle: String) {
    guard let context = context else {
        return
    }    
    todoData.title = newTitle
    
    do {
        try context.save()
    } catch {
        print("Error updating todo data title: \(error)")
    }
}

 

- todoData.title = newTitle
: title ๋ฐ”๊พธ๊ธฐ 

- context.save()
: ์ž„์‹œ์ €์žฅ์†Œ ์ €์žฅ

 

๋„ˆ๋ฌด ์‰ฝ์ฃ ?! ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•ด์ค€ ๋’ค context์— ์ €์žฅํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทผ๋ฐ ์™œ Update์™€ Delete ๊ณผ์ •์—๋Š” ๊ฐ’์„ ์š”์ฒญํ•ด์„œ fetch ํ•˜๋Š” ๊ณผ์ •์ด ์—†์„๊นŒ์š”? ๊ทธ ์ด์œ ๋Š” ์ด๋ฏธ ์•ฑ์—์„œ ์“ฐ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฐ’์„ ์ฝ”์–ด๋ฐ์ดํ„ฐ์—์„œ ๊บผ๋‚ด์™€์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋ ค๋Š” ๊ฒƒ์ธ์ง€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์‹ถ์€์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— fetch ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๊ฑฐ์ฃ !

 

 

 

์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์–ด์š”!!

๋‹ค์Œ ์‹œ๊ฐ„์—” ๋” ์„ธ์„ธํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์—๋Ÿฌ๋ฅผ ์žก๋Š”๋ฐ ์ง‘์ค‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!