WWDC/Swift

[Swift] WWDC23 - Migrate to SwiftData

유정주 2023. 6. 12. 12:32
반응형

서론

Migrate to SwiftData는 CoreData를 SwiftData로 변경하는 내용을 다룹니다.

변경하지 못하는 경우, 함께 사용하는 방법도 다루기 때문에 SwiftData 적용을 고려할 때 참고하면 좋을 듯 합니다.

개인적으로 SwiftData를 사용할 수 있는 iOS 17 시대가 되면 CoreData는 많이 사라지지 않을까 생각이 드네요.

 

참고로 SwiftData 영상은 총 5개로 순서는 아래와 같습니다.

  1. Meet SwiftData
  2. Build an app with SwiftData, Migrate to SwiftData
  3. Model your schema with SwiftData
  4. Dive deeper into SwiftData

 

이번 WWDC23부터는 영상 챕터가 지원됩니다.

이번 포스팅도 챕터 단위로 작성하였으니 참고 부탁드립니다.

 

 

Intro

Migrate to SwiftData 세션에서는 아래 내용을 다룹니다.

  1. CoreData 대신 SwiftData를 사용하는 방법
  2. CoreData와 SwiftData를 함께 사용하는 방법

 

SwiftData 소개는 Meet SwiftData 세션(WWDC23 - Meet SwiftData)에서 볼 수 있습니다.

 

이번 영상은 CoreData와 SwiftData를 연계하는 방법이 주내용이네요.

 

 

Generate model classes

Managed Object Model Editer는 SwiftData 모델을 쉽게 만들 수 있는 방법 중 하나입니다.

이전에 사용했던 CoreData 모델로 새로운 SwiftData 모델을 생성할 수 있습니다.

 

기존에 사용하던 CoreData 앱입니다.

Trip, LivingAccommodation, BucketListItem 엔티티가 존재하며, 각 Trip은 LivingAccommodation, BucketListItem에 관한 Relationship이 존재합니다.

 

 

CoreData Managed Object Model을 이용해 SwiftData 모델을 만들겠습니다.

(이를 사용하지 않고도 SwiftData Model을 만들 수 있습니다만, 이번 예제에서는 사용하는 방법을 알려주고 있습니다.)

Editor -> Create SwiftData Code를 선택하면 쉽게 파일을 생성할 수 있습니다.

 

기존 CoreData 모델의 모든 attribute와 relationship을 가지고 있는 코드를 볼 수 있습니다.

(@Model, @Relationship이 무엇인지는 Meet SwiftData 세션에서 다루고 있습니다.)

 

 

Complete adoption

다음은 CoreData를 SwiftData로 완전히 전환하는 과정을 소개합니다.

CoreData를 SwiftData로 마이그레이션할 때는 SwiftData의 Swift 기능을 활용합니다.

 

SwiftData 사전 준비

마이그레이션을 하기 전에 기존 CoreData 모델이 어떻게 구성되어 있는지 확인해야 합니다.

SwiftData 모델에는 CoreData 모델의 엔티티, 프로퍼티와 정확히 일치하는 이름이 존재해야 합니다.

 

마이그레이션 후에는 모든 기능이 올바르게 동작하는지 철저히 테스트해야 합니다.

SwiftData 모델이 준비되면 이전에 사용했던 CoreData Managed Ojbect Model 파일과 Persistence 파일을 삭제해도 됩니다.

 

 

다음은 SwiftData 스택을 위한 ModelContainer와 ModelContext를 설정합니다.

ModelContainer는 모든 WindowGroup이 동일한 persistance 컨테이너에 접근할 수 있게 하고,

ModelContext는 변경 내용 추적과 데이터 fetch를 가능하게 합니다.

 

 

객체 생성 방법 비교

위는 CoreData 방식입니다.

Context를 이용해 객체를 생성하고 프로퍼티 하나하나 설정해야 했습니다.

 

SwiftData에서는 새로운 객체를 생성하여 modelContext에 insert하면 됩니다.

Swift의 생성자를 그대로 사용할 수 있어 가독성에 좋습니다.

 

추가로 CoreData에서는 명시적으로 save를 호출해야 했지만, SwiftData는 Context가 변경되면 UI LifeCycle 이벤트 및 타이머에 의해 자동으로 저장됩니다.

따라서 CoreData처럼 명시적으로 save를 호출하지 않아도, 알아서 암시적으로 저장해 줍니다.

 

 

Fetch 비교

CoreData에서는 FetchRequest를 사용해 데이터를 가져옵니다.

 

 

SwiftData에서는 @Query를 이용해 데이터를 가져올 수 있습니다.

 

 

Coexists with Core Data

다음은 CoreData와 SwiftData를 함께 사용하는 경우입니다.

 

완전히 전환하는게 불가능하거나 비효율적인 경우 공존을 고려할 수 있습니다.

아래는 영상에서 공존을 추천하는 시나리오입니다.

  • 하위 호환성을 고려해야 하는 경우 : SwiftData는 iOS 17, macOS Sonoma부터 사용 가능함
  • 리소스 제약 : 완전히 전환할 인력, 시간이 없는 경우

 

공존 방법

CoreData 스택과 SwiftData 스택이 같은 persistance 저장소를 공유할 수 있으며

SwiftData는 NSManagedObject의 서브 클래스를 처리할 수 있습니다.

따라서 새로운 곳에 SwiftData를 부분적으로 도입할 수 있고, CoreData로 작성된 코드를 굳이 수정하지 않아도 됩니다.

저장소를 공유하기 때문에 이미 CoreData에 많은 데이터가 저장되어 있는 상황에서도 걱정할 필요가 없습니다.

 

 

단, 한 가지 주의해야 할 점이 있습니다.

CoreData와 SwiftData에 같은 저장소 URL을 설정해야 하고,

CoreData에 NSPersistentHistoryTrackingKey 옵션을 설정해야 합니다.

CoreData는 SwiftData와 달리 자동으로 히스토리 추적이 안 되기 때문입니다.

만약 이 옵션을 설정하지 않는다면 저장소가 read-only 모드로 전환됩니다.

 

 

공존을 위해 고려해야할 사항

CoreData와 SwiftData를 함께 사용하기로 결정했다면 세 가지를 고려해야 합니다.

 

 

클래스 이름 충돌 방지

NSManagedObject 엔티티 클래스와 SwiftData 모델 클래스의 이름이 충돌하지 않아야 합니다.

 

 

위 예시 코드에서는 두 클래스 이름이 Trip으로 동일합니다.

이럴 경우 클래스 이름 충돌이 발생합니다.

 

 

이런식으로 한 곳의 클래스 이름을 변경해야만 합니다.

위 코드에서는 CoreData의 CD를 Trip 앞에 붙여서 클래스 이름을 변경했네요.

 

 

스키마 동기화

CoreData와 SwiftData의 attribute와 relationship이 정확히 같은 방식으로 모델에 존재해야 합니다.

즉, 한 곳에서만 추가하거나 제거하면 안 됩니다.

모든 단계에서 엔티티 해시가 일치해야 하며, 일치하지 않는 경우 의도치 않게 정보가 삭제될 수 있습니다.

 

 

스키마 버전 관리

SwiftData 모델을 여러 버전으로 작업할 때 변경 사항이 잘 적용되었는지 확인해야 합니다.

이에 대한 자세한 내용은 WWDC23 - Model your schema with SwiftData에서 다룹니다.

 

 

감사합니다.

 


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형