본문 바로가기
SwiftUI

SwiftUI와 Core Data 연동

by 안될개발 2025. 2. 5.

SwiftUI와 Core Data 연동

SwiftUI와 Core Data 연동

Core Data는 Apple의 영속성 프레임워크로, 데이터를 저장하고 관리하는 데 사용됩니다. SwiftUI와 Core Data를 연동하면 데이터 중심의 앱을 쉽고 효율적으로 개발할 수 있습니다. 이번 글에서는 Core Data 설정 방법과 SwiftUI에서 사용하는 기초적인 예제를 소개합니다.


1. Core Data 설정하기

프로젝트에 Core Data 추가

  1. 새로운 프로젝트를 생성할 때 Use Core Data 옵션을 체크합니다.
  2. 기존 프로젝트에 Core Data를 추가하려면 다음을 수행합니다:
    • File > New > File > Data Model을 선택하고 .xcdatamodeld 파일을 생성합니다.
    • AppDelegate 또는 SceneDelegate에 Core Data 스택 코드를 추가하거나 최신 프로젝트에서는 PersistenceController를 통해 Core Data 스택을 관리합니다.

PersistenceController 생성

Xcode가 자동으로 생성해 주는 Core Data 스택은 다음과 같은 형태입니다:

import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "MyModel")

        if inMemory {
            container.persistentStoreDescriptions.first?.url = URL(fileURLWithPath: "/dev/null")
        }

        container.loadPersistentStores { description, error in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        }
    }
}

2. Core Data 모델 정의

예제에서는 "Task" 엔티티에 title(String), isCompleted(Boolean) 속성을 추가한다고 가정합니다.

  1. .xcdatamodeld 파일을 열어 새로운 엔티티 Task를 추가합니다.
  2. 속성으로 title(String)과 isCompleted(Boolean)을 설정합니다.

3. SwiftUI에서 Core Data 사용

Core Data를 사용하는 SwiftUI 앱에서는 @FetchRequest와 @Environment(\.managedObjectContext)를 활용합니다.

기본 예제: Task 목록 관리

import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Task.title, ascending: true)],
        animation: .default)
    private var tasks: FetchedResults<Task>

    var body: some View {
        NavigationView {
            List {
                ForEach(tasks) { task in
                    HStack {
                        Text(task.title ?? "Untitled")
                        Spacer()
                        Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle")
                            .foregroundColor(task.isCompleted ? .green : .gray)
                    }
                }
                .onDelete(perform: deleteTasks)
            }
            .navigationTitle("Tasks")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button(action: addTask) {
                        Label("Add Task", systemImage: "plus")
                    }
                }
            }
        }
    }

    private func addTask() {
        withAnimation {
            let newTask = Task(context: viewContext)
            newTask.title = "New Task"
            newTask.isCompleted = false

            saveContext()
        }
    }

    private func deleteTasks(offsets: IndexSet) {
        withAnimation {
            offsets.map { tasks[$0] }.forEach(viewContext.delete)
            saveContext()
        }
    }

    private func saveContext() {
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
    }
}

주요 포인트

  • @Environment(.managedObjectContext): Core Data 컨텍스트를 주입받습니다.
  • @FetchRequest: Core Data 엔티티 데이터를 가져옵니다.
  • withAnimation: 데이터 추가 및 삭제에 애니메이션 효과를 줍니다.
  • viewContext.save(): 변경 사항을 영구 저장합니다.

4. 데이터 저장 및 삭제

Core Data는 영구 저장소에 데이터를 저장하므로 viewContext.save() 호출이 필요합니다. 데이터 삭제 시에도 반드시 저장 작업이 필요합니다.

예제: 데이터 삭제

private func deleteTasks(offsets: IndexSet) {
    withAnimation {
        offsets.map { tasks[$0] }.forEach(viewContext.delete)
        saveContext()
    }
}

5. 결론

SwiftUI와 Core Data를 연동하면 데이터 중심의 앱을 손쉽게 개발할 수 있습니다.

Core Data의 강력한 데이터 관리 기능과 SwiftUI의 직관적인 UI 구성 방식을 조합하여 보다 효율적인 앱을 만들어 보시기 바랍니다.