👨‍💻 프로그래밍/🍎 iOS 개발

🍎 Swift Data로 Core Data 대체하기

by 개발자 진개미 2023. 12. 10.
반응형


Swift Data와 Core Data가 뭐야?

Core DataSwift Data 모두 iOS에서 데이터를 저장하기 위해 사용하는 기술입니다. 보통 가장 많이 쓰는 DB들 (MySQL, OracleDB, PostgreSQL 등)은 서버에서 돌아가고, API를 통해 데이터에 접근합니다. 반면 Swift Data와 Core Data는 모두 내부에서 SQLite라는 DB를 사용하는데, 이건 모든 데이터를 1개의 파일에 저장해 놓는 방식으로 간편하게 사용 가능한 DB의 일종입니다. 

당연히 대규모 트래픽을 받거나 Transaction 처리에는 적합하지 않고, 유저 1명의 앱 내 데이터를 저장하는 데는 괜찮습니다.

Core Data는 iOS 초기부터 굉장히 오랜 기간 사용돼 왔지만 그만큼 오래된 API라 사용하기도 불편하고 비직관적인 부분도 많습니다. 그래서 Apple은 Swift, SwiftUI 기반의 Swift Data를 소개했습니다. Swift Data는 결국 Core Data로 바뀌고, Core Data는 내부에서는 SQLite를 사용하기 때문에 결국 Swift Data도 SQLite 기반입니다. Swift Data는 Core Data의 Wrapper 역할이기 때문에 Core Data와 Swift Data는 어느 정도 병행해서 사용할 수 있습니다.


Core Data를 Swift Data의 @Model로 바꾸기

Core Data를 사용하면 .xcdatamodeld라는 확장자의 파일에 데이터 모델을 명시해 줍니다. 보통은 아래와 같은 XCode UI를 통해서 정의합니다.

 

SwiftUI에서는 이런 데이터 모델들을 Swift 코드로 정의하기 때문에, 첫 단계로 우선 저 데이터 모델들을 Swift Data의 @Model을 써서 코드로 바꿔 줘야 합니다. 물론 이 과정을 직접해도 되지만 Core Data 모델로 가서 Editor -> Create SwiftData Code... 를 선택하면 XCode가 자동으로 해 줍니다.


다만 XCode가 만들어준 Swift Data 모델을 그대로 사용할 수는 없습니다. XCode가 만들어준 데이터 모델을 봐 보시면...

@Model public class Item {
    var timestamp: Date?
    var name: String?
    var imageUrl: String?

    public init() {}   
}
  1. 모든 값을 Optional (?)하게 만들었다.
  2. init에 아무 값도 없게 만들었다.
  3. public으로 만들었다.

같은 문제점이 있어서 이걸 고쳐 줘야 합니다.

import Foundation
import SwiftData

@Model
class Item {
    var timestamp: Date
    var name: String
    var imageUrl: String
    
    init(timestamp: Date, name: String, imageUrl: String) {
        self.timestamp = timestamp
        self.name = name
        self.imageUrl = imageUrl
    }
}

 

주의할 점은 CloudKit을 사용해야 한다면 Optional 값에 기본값을 줘야 하고, @Relationship을 제대로 사용했는지 확인해야 합니다. 또 필요하다면 @Attribute으로 unique 값 등을 명시해 주면 좋습니다. (이미 Core Data를 사용하고 계셨다면 데이터 모델은 잘 만들어져 있겠지만 가독성을 위해)


Swift Data로 CRUD 하기

다음으로 굉장히 귀찮은 부분이 남았습니다. Core Data로 CRUD (Create, Read, Update, Delete)를 하는 부분을 모두 Swift Data를 쓰도록 바꿔 줘야 합니다.

여기서 Swift Data는 나온 지 얼마 안 됐기 때문에 Core Data에서는 지원하지만 Swift Data에서는 지원하지 않은 동작들이 몇 개 있는데 이 경우는 해당 동작을 없애거나 Swift Data 도입을 미루는 수밖에 없습니다. 다른 여러 창의적인 방법으로 Swift Data로 할 수 있기는 하겠지만 Swift Data의 장점이 간단하고 읽기 쉽다는 것인데 그 장점을 희생해 가며 잘 돌아가고 있던 Core Data를 Swift Data로 굳이 바꿀 필요는 없다고 생각합니다.

아무튼, 아래 것들을 바꿔 주세요.

  1. @FetchRequest를 쓰던 것들은 모두 @Query
  2. managedObjectContext를 쓰던 건 모두 modelContext
  3. 가져온 데이터를 저장하던 @StateObject는 모두 @State

참고

 

Adopting SwiftData for a Core Data app | Apple Developer Documentation

Persist data in your app intuitively with the Swift native persistence framework.

developer.apple.com

 

 

How to migrate an app from Core Data to SwiftData - a free SwiftData by Example tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com


반응형