일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- ios프로그래밍
- IT트렌드
- 웹개발
- Swift
- swiftdata
- 머신러닝
- 비동기처리
- SwiftUI
- swiftmacros
- CleanArchitecture
- Combine
- MVVM
- RxSwift
- 서버개발
- MVC
- 비동기프로그래밍
- swift공부
- Viper
- Redux
- coredata
- 아키텍처패턴
- swiftcombine
- 데이터분석
- 개발자블로그
- asyncawait
- 프로그래밍
- swiftconcurrency
- go언어
- ios
- iOS개발
- Today
- Total
탐험하는 바이트스토리
SwiftData 1편, Core Data는 왜 그렇게 어려웠을까? 본문
🧠 1편. Core Data는 왜 그렇게 어려웠을까?
나는 처음 iOS 개발을 시작했을 때, 가장 무서웠던 키워드 중 하나가 바로 Core Data였다.
앱을 만들다 보면 사용자 데이터를 저장해야 할 때가 꼭 오기 마련이다.
사진, 메모, 즐겨찾기, 설정값… 뭐든 간에 앱을 껐다 켜도 살아있으려면 어딘가에 저장을 해야 하니까.
그런데 막상 "iOS에서 데이터를 저장하려면 뭘 써야 할까?"
검색하면 늘 빠지지 않고 등장하는 이 녀석.
바로 Core Data였다.
😨 개발자 입문 초기의 흔한 Core Data 감정선
"오케이, 이게 데이터를 저장해주는 기술이구나!"
→ "흠… 근데 왜 저장이 안 되지?"
→ "이게 context가 왜 또 여러 개야?"
→ "왜 저장했는데 다시 켜면 데이터가 날아가있지?"
→ "뭔가 했는데… 에러는 안 나고 작동도 안 해…"
→ fatal error: unexpectedly found nil while unwrapping an Optional value
그 시절의 나는 아마 하루에도 수십 번씩 save()
를 누르며 기도했던 것 같다.
그리고 생각했다.
“왜 Apple은 이렇게까지 복잡한 기술을 만들었을까?”
🗂️ Core Data = 데이터베이스? 아니다.
많은 개발자들이 처음엔 이렇게 접근한다:
“Core Data는 SQLite를 쉽게 쓰게 해주는 거지?”
하지만 사실 Core Data는 SQLite의 래퍼가 아니다.
SQLite는 단지 "데이터를 디스크에 저장하는 수단"이고,
Core Data는 객체 그래프 관리를 위한 프레임워크다.
📌 객체 그래프란?
- 앱 안에서 존재하는 객체들이 서로 연결된 구조
- 예:
User
→Post
→Comment
- 이런 연결 관계를 효율적으로 저장하고 다시 불러오는 게 Core Data의 목적
Core Data는 이걸 위해 다양한 역할을 하는 객체들을 도입했다:
구성 요소 | 설명 |
---|---|
NSManagedObject |
데이터 모델 객체 |
NSManagedObjectContext |
데이터를 읽고 쓰는 공간 (일종의 작업 공간) |
NSPersistentStoreCoordinator |
실제 저장소와 연결하는 역할 |
NSFetchRequest |
데이터를 검색하기 위한 요청 객체 |
💻 기본적인 Core Data 코드 예제
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")
do {
let people = try context.fetch(fetchRequest)
for person in people {
print(person.value(forKey: "name") as? String ?? "No name")
}
} catch {
print("Failed to fetch: \(error)")
}
이건 그냥 Person
목록을 불러오는 코드인데…
보는 순간 초보 개발자는 무슨 느낌이냐면:
“이걸 진짜 매번 이렇게 써야 해…?”
그래서 실무에서 CoreData를 적극적 사용하지 않는 경우가 많았다.
🧠 실제로 많이 헷갈리는 Core Data의 개념들
- Context를 왜 여러 개 만들어야 하지?
save()
는 언제 호출해야 할까?faulting
이 뭐지?objectID
?reset()
은 뭘까?
이런 용어들만 들어도 피로감이 온다.
그러다 보니, 많은 개발자들이 Realm 같은 대안으로 넘어가기도 했다.
🧱 그럼에도 불구하고, Core Data는 잘 만들어진 기술이다
Core Data는 몇 가지 매우 강력한 기능을 갖고 있다:
- ✅ 페치 성능 최적화
- ✅ 관계형 데이터의 연속 관리
- ✅ Undo/Redo 기능 내장
- ✅ iCloud 연동 가능
- ✅ 대용량 데이터 처리 최적화
- ✅ 메모리 최적화 기법 풍부
📍예시: iOS 기본 메모 앱도 사실 Core Data 기반이다.
📉 왜 Core Data는 점점 부담스러워졌을까?
문제는 시대의 흐름이었다.
- Swift 등장 → 타입 안정성 중시
- SwiftUI 등장 → 선언형 프로그래밍 확산
하지만 Core Data는 여전히 Objective-C 기반 설계가 짙었다.
요즘은 점점 Objective-C 기반 프로젝트를 보기도 쉽지 않다.
- 런타임 KVC (
value(forKey:)
) 기반 - 코드가 복잡하고 선언형과 맞지 않음
- SwiftUI와의 연결성도 제한적
결국 우리는 생각하게 된다.
“Swift 시대에 어울리는, 더 깔끔한 방식 없을까?”
🌱 SwiftData의 서막
2023년 WWDC에서 Apple은 새로운 데이터 프레임워크를 소개한다.
바로 SwiftData.
@Model
class Todo {
var title: String
var isDone: Bool
}
Swift 코드 그대로 모델을 정의하고, SwiftUI와 자연스럽게 연결된다.
Core Data 위에 얹혀 있지만 전혀 다르게 느껴지는 이 기술.
SwiftData의 등장은 단순한 기술 추가가 아니었다.
이제 번거로운 과정없이 단순 몇줄 코드만으로 기술적용이 가능하다!
“이제 우리는 진짜 Swift 시대에 진입했다.”
🧭 왜 SwiftData는 지금 등장했을까?
- Swift → SwiftUI → 선언형 시대
- Core Data는 Objective-C 느낌 가득
- SwiftUI의 흐름에 어울리지 않음
Apple도 알았다.
"Swift스럽게 데이터 다룰 방법 필요하다!"
📐 SwiftData의 기본 철학 4가지
- Swift-native 선언형 모델링
- SwiftUI와의 자연스러운 통합
- 타입 안정성 강화
- 낮은 진입 장벽
🧪 Core Data vs SwiftData 모델 선언 비교
💾 Core Data
class Person: NSManagedObject {
@NSManaged var name: String
@NSManaged var age: Int16
}
🌱 SwiftData
@Model
class Person {
var name: String
var age: Int
}
📦 데이터 쓰기 & 읽기
Core Data
let fetchRequest = NSFetchRequest<Person>(entityName: "Person")
do {
let people = try context.fetch(fetchRequest)
} catch {
print("Fetch error")
}
SwiftData
@Query var people: [Person]
Predicate도 지원:
@Query(filter: #Predicate { $0.age > 20 }) var adults: [Person]
🧩 Context 사용도 쉬워짐
@Environment(\.modelContext) var context
let person = Person(name: "Alice", age: 30)
context.insert(person)
try? context.save()
❗ Core Data 완전 대체일까?
- SwiftData는 내부적으로 Core Data 위에서 작동
- iOS 17 이상만 지원
- 마이그레이션 도구 미흡
✍️ 마치며: Core Data, 고마웠어
Core Data는 수많은 앱을 든든하게 지탱해준 백엔드 기술이었다.
이제는 조금 낡았고, 새로운 세대에게는 익숙하지 않을 수 있지만
SwiftData의 기반이 되었다는 점에서 그 역할은 끝난 게 아니다.
그리고 어떻게 우리를 더 빠르게 만들 수 있는지를 이야기해보죠!
그럼, 지금까지 읽어주셔서 감사합니다.! 궁금한 점은 댓글로 편하게 남겨주세요 🙌
추천글
[프로그래밍] - Swift Concurrency, async/await의 개념과 기존 방식과의 차이
Swift Concurrency, async/await의 개념과 기존 방식과의 차이
async/await의 개념과 기존 방식과의 차이Swift 5.5부터 등장한 Concurrency 기능,특히 async/await 키워드 덕분에 iOS 개발자들 사이에서는 마치 신세계가 열린 듯한 느낌이 들었죠.저도 처음 이 기능을 접했
bytestory.tistory.com
'프로그래밍' 카테고리의 다른 글
SwiftData 2편, SwiftData vs Core Data: 코드로 느껴보는 진짜 차이 (0) | 2025.04.10 |
---|---|
Swift Concurrency, 궁금한 점들 정리해보자. (0) | 2025.04.10 |
Swift Concurrency - Task, TaskGroup, 그리고 Actor까지 (1) | 2025.04.09 |
Swift Concurrency, async/await의 개념과 기존 방식과의 차이 (1) | 2025.04.08 |
Dart: 플러터의 심장, 웹과 모바일을 잇는 강력한 언어 (0) | 2025.03.19 |