Core Data는 Apple 플랫폼에서 데이터를 영구적으로 저장하고 관리하기 위한 강력한 프레임워크입니다. 객체 그래프 관리, 영구 저장소와의 상호 작용, 데이터 변경 추적 등 앱의 데이터 레이어를 체계적으로 구축할 수 있도록 지원합니다. SwiftUI와 함께 사용하면 선언적인 방식으로 데이터 모델을 정의하고, 뷰와 데이터를 효율적으로 연결하여 데이터 중심의 앱 개발을 간편하게 할 수 있습니다. 이 글에서는 Core Data의 기본 개념을 소개하고, SwiftUI 환경에서 Core Data를 통합하여 데이터를 저장하고 조회하는 기본적인 방법을 예제 코드와 함께 설명합니다.
Core Data의 핵심 개념과 역할
Core Data는 단순한 데이터베이스가 아닌, 객체 그래프를 관리하는 프레임워크입니다. 앱의 모델 계층을 시각적으로 디자인하고, 메모리 상의 객체와 영구 저장소(일반적으로 SQLite 데이터베이스) 간의 데이터 동기화를 추상화합니다. Core Data를 사용하면 다음과 같은 이점을 얻을 수 있습니다.
- 객체 그래프 관리: 데이터 모델을 엔티티와 관계를 사용하여 정의하고, 메모리 상에서 객체 형태로 데이터를 조작할 수 있습니다.
- 영구 저장소 추상화: 데이터 저장 방식을 직접 다루지 않고, Core Data가 영구 저장소와의 상호 작용을 처리합니다. SQLite, XML, 바이너리 등 다양한 저장 방식을 지원합니다.
- 데이터 변경 추적 및 관리: 객체의 변경 사항을 자동으로 추적하고, 저장 시 필요한 SQL 쿼리 생성 등을 Core Data가 담당합니다.
- 성능 최적화: 지연 로딩, 객체 캐싱 등 성능 최적화를 위한 다양한 기능을 제공합니다.
- 데이터 마이그레이션: 앱의 데이터 모델이 변경될 때, 기존 데이터를 새로운 모델에 맞게 변환하는 마이그레이션 기능을 지원합니다.
SwiftUI 환경에서 Core Data는 앱의 상태 관리와 뷰 업데이트를 효율적으로 처리하는 데 중요한 역할을 합니다. @Environment(\.managedObjectContext)
속성 래퍼를 통해 SwiftUI 뷰에서 Core Data의 관리 객체 컨텍스트에 쉽게 접근할 수 있으며, @FetchRequest
속성 래퍼를 사용하여 특정 엔티티의 데이터를 간편하게 가져올 수 있습니다.
SwiftUI 프로젝트에 Core Data 통합하기
새로운 SwiftUI 프로젝트를 생성할 때 Core Data 지원을 포함시키거나, 기존 프로젝트에 Core Data를 추가할 수 있습니다.
1. 새로운 프로젝트 생성 시 Core Data 활성화
- Xcode를 실행하고 Create a new Xcode project를 선택합니다.
- iOS 탭에서 App 템플릿을 선택하고 Next를 클릭합니다.
- 프로젝트 이름, 팀, 식별자 등을 설정하고, Include Core Data 체크박스를 선택합니다.
- 프로젝트 저장 위치를 선택하고 Create를 클릭합니다.
Core Data를 포함하여 프로젝트를 생성하면, Xcode는 자동으로 Core Data 스택을 설정하고 .xcdatamodeld
파일 (데이터 모델 편집기)을 프로젝트에 추가합니다. 또한, 앱의 메인 구조체에 Core Data 관련 코드가 포함된 PersistenceController
클래스가 생성됩니다.
2. 기존 프로젝트에 Core Data 추가
기존 SwiftUI 프로젝트에 Core Data를 추가하려면 다음과 같은 단계를 거칩니다.
Xcode 프로젝트 탐색기에서 프로젝트 파일을 선택하고, File > New > File... 을 클릭합니다.
Core Data 섹션에서 Data Model을 선택하고 Next를 클릭합니다.
데이터 모델 파일 이름 (예:
Model.xcdatamodeld
)을 지정하고 Create를 클릭합니다.앱의 메인 구조체 (
App.swift
)를 열고PersistenceController
클래스를 추가합니다. 이는 Core Data 스택을 초기화하고 관리 객체 컨텍스트를 제공하는 역할을 합니다.import SwiftUI
import CoreDataclass PersistenceController {
static let shared = PersistenceController()let container: NSPersistentContainer init(inMemory: Bool = false) { container = NSPersistentContainer(name: "YourProjectName") // 데이터 모델 파일 이름으로 변경 if inMemory { container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") } container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) } var container.viewContext: NSManagedObjectContext { return container.viewContext }
}
@main
struct YourAppName: App {
let persistenceController = PersistenceController.sharedvar body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, persistenceController.container.viewContext) } }
}
주의:
NSPersistentContainer(name: "YourProjectName")
부분에서"YourProjectName"
을 실제 데이터 모델 파일의 이름 (확장자 제외)으로 변경해야 합니다.
데이터 모델 편집기 (.xcdatamodeld
) 사용하기
.xcdatamodeld
파일을 열면 데이터 모델 편집기가 나타납니다. 여기서 앱에서 사용할 엔티티 (데이터의 구조), 속성 (엔티티가 가지는 데이터 필드), 관계 (엔티티 간의 연결)를 시각적으로 정의할 수 있습니다.
1. 엔티티 생성
왼쪽 하단의 Add Entity 버튼 (+)을 클릭하여 새로운 엔티티를 생성합니다. 엔티티의 이름 (예: Task
)을 지정합니다.
2. 속성 추가
선택한 엔티티의 Attributes 섹션에서 Add Attribute 버튼 (+)을 클릭하여 속성을 추가합니다. 각 속성의 이름 (예: title
, isCompleted
)과 데이터 타입 (예: String
, Boolean
)을 설정합니다.
3. 관계 정의 (선택 사항)
엔티티 간의 관계를 정의하려면 Relationships 섹션에서 Add Relationship 버튼 (+)을 클릭합니다. 관계의 이름, 대상 엔티티, 삭제 규칙 (cascade, nullify 등), 역 관계 등을 설정합니다.
SwiftUI 뷰에서 Core Data 사용하기
Core Data 스택이 설정되고 데이터 모델이 정의되면, SwiftUI 뷰에서 Core Data를 사용하여 데이터를 저장하고 조회할 수 있습니다.
1. 관리 객체 컨텍스트 접근
@Environment(\.managedObjectContext)
속성 래퍼를 사용하여 현재 SwiftUI 환경에서 관리 객체 컨텍스트에 접근합니다.
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(.managedObjectContext) private var viewContext
var body: some View {
// ...
}
}
2. 데이터 저장
새로운 데이터를 Core Data에 저장하려면, 해당 엔티티의 관리 객체를 생성하고 속성 값을 설정한 후, viewContext.save()
메서드를 호출하여 변경 사항을 영구 저장소에 반영합니다.
struct AddTaskView: View {
@Environment(.managedObjectContext) private var viewContext
@Environment(.dismiss) var dismiss
@State private var taskTitle: String = ""
var body: some View {
NavigationView {
Form {
TextField("할 일", text: $taskTitle)
}
.navigationTitle("새로운 할 일 추가")
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("취소") {
dismiss()
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("저장") {
addItem()
dismiss()
}
.disabled(taskTitle.isEmpty)
}
}
}
}
private func addItem() {
withAnimation {
let newItem = Task(context: viewContext) // Task는 데이터 모델에 정의된 엔티티 이름
newItem.title = taskTitle
newItem.isCompleted = false
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
3. 데이터 조회
@FetchRequest
속성 래퍼를 사용하여 특정 엔티티의 데이터를 가져올 수 있습니다. 페치 요청은 정렬 방식, 필터 조건 등을 포함할 수 있습니다.
struct TaskListView: View {
@Environment(.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Task.title, ascending: true)],
animation: .default
) private var tasks: FetchedResults<Task> // Task는 데이터 모델에 정의된 엔티티 이름
var body: some View {
List {
ForEach(tasks) { task in
Text(task.title ?? "알 수 없는 할 일")
}
.onDelete(perform: deleteTask)
}
}
private func deleteTask(offsets: IndexSet) {
withAnimation {
offsets.map { tasks[$0] }.forEach(viewContext.delete)
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
코드 설명:
@FetchRequest(...) private var tasks: FetchedResults<Task>
:Task
엔티티의 모든 데이터를title
속성을 기준으로 오름차순으로 정렬하여 가져옵니다.@FetchRequest
는 뷰가 생성될 때 자동으로 데이터를 페칭하고, Core Data 컨텍스트의 변경 사항을 감지하여 뷰를 업데이트합니다.FetchedResults<Task>
: 페치된Task
객체의 컬렉션입니다.ForEach
구문을 사용하여 리스트에 표시할 수 있습니다.deleteTask(offsets:)
: 리스트에서 특정 항목을 삭제하는 함수입니다.viewContext.delete()
를 호출하여 Core Data에서 객체를 삭제하고,viewContext.save()
를 호출하여 변경 사항을 저장소에 반영합니다.
데이터 업데이트 및 삭제
- 업데이트: 페치된 객체의 속성 값을 변경한 후
viewContext.save()
를 호출하면 변경 사항이 저장소에 반영됩니다. SwiftUI 뷰는@FetchRequest
덕분에 자동으로 업데이트됩니다. - 삭제: 관리 객체 컨텍스트의
delete(_:)
메서드를 사용하여 객체를 삭제한 후viewContext.save()
를 호출합니다.
결론
Core Data는 iOS 앱에서 데이터를 효율적이고 체계적으로 관리하기 위한 필수적인 프레임워크이며, SwiftUI와 함께 사용하면 데이터 중심의 사용자 인터페이스를 선언적으로 쉽게 구축할 수 있습니다. 데이터 모델링부터 저장, 조회, 업데이트, 삭제까지 Core Data의 기본 흐름을 이해하고 SwiftUI와의 통합 방법을 익힘으로써, 여러분은 더욱 강력하고 안정적인 iOS 앱을 개발할 수 있을 것입니다.
'iOS 프로그래밍' 카테고리의 다른 글
SwiftUI DocumentGroup 개요: 문서 기반 앱 개발의 새로운 접근 (0) | 2025.06.05 |
---|---|
SwiftUI 코어 데이터 튜토리얼: 영구 데이터 저장 및 관리 (0) | 2025.06.04 |
SwiftUI로 iOS 앱에 차트 표시하기: 데이터 시각화의 모든 것 (1) | 2025.06.04 |
SwiftUI에서 탭 그리고 페이지 뷰 구축하기 (0) | 2025.05.28 |
SwiftUI 차트 튜토리얼: iOS 16 앱을 위한 데이터 시각화 마스터하기 (0) | 2025.05.26 |