탐험하는 바이트스토리

SwiftData 2편, SwiftData vs Core Data: 코드로 느껴보는 진짜 차이 본문

프로그래밍

SwiftData 2편, SwiftData vs Core Data: 코드로 느껴보는 진짜 차이

버그메이커 2025. 4. 10. 16:48
반응형

🧪 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는 왜 그렇게 어려웠을까?

 

반응형