탐험하는 바이트스토리

SwiftData 1편, Core Data는 왜 그렇게 어려웠을까? 본문

프로그래밍

SwiftData 1편, Core Data는 왜 그렇게 어려웠을까?

버그메이커 2025. 4. 9. 17:38
반응형

🧠 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는 객체 그래프 관리를 위한 프레임워크다.

 

📌 객체 그래프란?

  • 앱 안에서 존재하는 객체들이 서로 연결된 구조
  • 예: UserPostComment
  • 이런 연결 관계를 효율적으로 저장하고 다시 불러오는 게 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가지

  1. Swift-native 선언형 모델링
  2. SwiftUI와의 자연스러운 통합
  3. 타입 안정성 강화
  4. 낮은 진입 장벽

🧪 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

 

반응형