SwiftUI와 Core Data 연동
Core Data는 Apple의 영속성 프레임워크로, 데이터를 저장하고 관리하는 데 사용됩니다. SwiftUI와 Core Data를 연동하면 데이터 중심의 앱을 쉽고 효율적으로 개발할 수 있습니다. 이번 글에서는 Core Data 설정 방법과 SwiftUI에서 사용하는 기초적인 예제를 소개합니다.
1. Core Data 설정하기
프로젝트에 Core Data 추가
- 새로운 프로젝트를 생성할 때 Use Core Data 옵션을 체크합니다.
- 기존 프로젝트에 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) 속성을 추가한다고 가정합니다.
- .xcdatamodeld 파일을 열어 새로운 엔티티 Task를 추가합니다.
- 속성으로 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 구성 방식을 조합하여 보다 효율적인 앱을 만들어 보시기 바랍니다.
'SwiftUI' 카테고리의 다른 글
SwiftUI 성능 최적화 기법 (0) | 2025.02.05 |
---|---|
SwiftUI 앱 퍼블리싱 및 배포 (0) | 2025.02.05 |
SwiftUI에서 사용자 입력 및 폼 다루기 (0) | 2025.02.05 |
SwiftUI에서 애니메이션과 트랜지션 다루기 (0) | 2025.02.05 |
SwiftUI에서의 네트워킹 및 데이터 처리 (0) | 2025.02.05 |