Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 비동기프로그래밍
- MVVM
- swiftmacros
- 데이터분석
- swiftcombine
- Swift
- Viper
- coredata
- 서버개발
- MVC
- go언어
- RxSwift
- swift공부
- 아키텍처패턴
- SwiftUI
- 개발자블로그
- iOS개발
- ios
- IT트렌드
- ios프로그래밍
- swiftconcurrency
- asyncawait
- Redux
- CleanArchitecture
- Combine
- swiftdata
- 웹개발
- 비동기처리
- 프로그래밍
- 머신러닝
Archives
- Today
- Total
탐험하는 바이트스토리
SwiftData 2편, SwiftData vs Core Data: 코드로 느껴보는 진짜 차이 본문
반응형
🧪 2편. SwiftData vs Core Data: 코드로 느껴보는 진짜 차이
앞선 두 편에서 우리는 Core Data의 역사와 SwiftData의 철학을 살펴봤다.
이번 편에서는 실전 코드 비교를 통해 이 두 기술이 실제로 어떤 체감 차이를 만드는지를 자세히 들여다보자.
그냥 "심플해졌어요~"로 끝나는 이야기가 아니다.
코드의 가독성, 유지보수성, SwiftUI와의 시너지까지 완전히 달라졌다는 걸 느낄 수 있을 것이다.
🏗️ 모델 정의부터 다르다
Core Data 방식 (NSManagedObject 기반)
class Memo: NSManagedObject {
@NSManaged var title: String
@NSManaged var content: String
@NSManaged var createdAt: Date
}
@NSManaged
키워드 필수- 타입 안전성 부족 (런타임 오류 발생 가능성)
- Xcode 모델 에디터(.xcdatamodeld)를 써야 구조를 설정할 수 있음
SwiftData 방식 (Swift-native)
@Model
class Memo {
var title: String
var content: String
var createdAt: Date = .now
}
- Swift 코드로 직접 모델 정의
- 런타임이 아닌 컴파일 타임에 오류 검출 가능
Codable
이나Hashable
등 Swift 기능과 쉽게 연동 가능
🧾 데이터 저장: insert & save
Core Data
let memo = Memo(context: context)
memo.title = "회의록"
memo.content = "오후 3시 회의"
memo.createdAt = Date()
try? context.save()
context
를 직접 주입해야 함save()
호출 타이밍과 위치에 신경 써야 함
SwiftData
@Environment(\.modelContext) var context
let memo = Memo(title: "회의록", content: "오후 3시 회의")
context.insert(memo)
try? context.save()
- SwiftUI 스타일의
@Environment
로 context 자동 주입 insert()
만으로도 직관적Observable
구조와 자연스럽게 연동 가능
🔍 데이터 읽기: fetch (query)
Core Data
let request = NSFetchRequest<Memo>(entityName: "Memo")
request.predicate = NSPredicate(format: "title CONTAINS %@", "회의")
let result = try? context.fetch(request)
- 문자열 기반 predicate (오타에 취약)
- 타입 안전성 낮음
- 코드 길고 가독성 떨어짐
SwiftData
@Query(filter: #Predicate { $0.title.contains("회의") }) var memos: [Memo]
- 선언형 DSL로 predicate 정의
- 오타/실수 시 컴파일 에러 발생
- SwiftUI 뷰 내에서 바로 사용 가능
🔄 데이터 갱신
Core Data
memo.title = "업데이트된 회의록"
try? context.save()
SwiftData
memo.title = "업데이트된 회의록"
try? context.save()
- 이 부분은 거의 동일하지만 SwiftData에서는 context 관리가 훨씬 자연스럽다.
❌ 삭제도 더 쉬워짐
Core Data
context.delete(memo)
try? context.save()
SwiftData
context.delete(memo)
try? context.save()
- 삭제 API는 동일하지만, SwiftData에서는 context 접근이 쉬워서 코드 흐름이 간결해진다.
🧘 한눈에 비교 정리
기능 | Core Data | SwiftData |
---|---|---|
모델 정의 | @NSManaged , xcdatamodeld |
Swift 코드 기반 @Model |
context 접근 | 직접 전달 | @Environment 자동 주입 |
fetch 방식 | NSFetchRequest + NSPredicate | @Query + #Predicate |
SwiftUI 연동 | 어렵고 제한적 | 매우 자연스러움 |
타입 안정성 | 낮음 (런타임 오류) | 높음 (컴파일 오류) |
✨ 결론: "이제는 Swift스럽게 데이터 다룰 시간"
SwiftData는 단순히 코드 줄 수를 줄인 게 아니다.
개발자가 실수하기 어려운 구조로 안내하고,
SwiftUI 중심 개발 플로우와 딱 맞게 동작하도록 설계되었다.
Core Data를 오랫동안 써온 사람에게는 약간 낯설 수 있지만,
처음부터 SwiftData로 시작하는 개발자에겐 너무나 당연하고 자연스러운 방식이지 않을까 싶네요.
그럼, 지금까지 읽어주셔서 감사합니다.! 궁금한 점은 댓글로 편하게 남겨주세요 🙌
이전글
[프로그래밍] - SwiftData 1편, Core Data는 왜 그렇게 어려웠을까?
반응형
'프로그래밍' 카테고리의 다른 글
SwiftData 3편, 완벽하진 않지만 기대되는 이유 (0) | 2025.04.11 |
---|---|
Swift Concurrency, 실무 예제로 배우는 Structured Concurrency (0) | 2025.04.11 |
Swift Concurrency, 궁금한 점들 정리해보자. (0) | 2025.04.10 |
SwiftData 1편, Core Data는 왜 그렇게 어려웠을까? (0) | 2025.04.09 |
Swift Concurrency - Task, TaskGroup, 그리고 Actor까지 (1) | 2025.04.09 |