WWDC/Swift

[Swift] WWDC23 - Meet SwiftData

유정주 2023. 6. 11. 14:44
반응형

서론

WWDC23에 새로운 데이터 관리 프레임워크가 나왔습니다.

 

저는 개인 프로젝트에 CoreData를 자주 사용하고 있는데 학습하고 사용하는게 쉬운 편이 아니라

SwiftData가 이 단점을 해소시켜줄 수 있을지 궁금했습니다 ㅎ

 

Meet SwiftData는 9분이라는 짧은 길이의 영상이므로 직접 보시는 것도 추천 드립니다.

 

참고로 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

 

또한, 이번 영상에서도 Swift macro 이야기가 나옵니다.

Swift 매크로는 WWDC23 - What's new in Swift에서 소개된 새로운 기능입니다.

먼저 짧게 학습한 뒤 영상 보시는 걸 추천 드립니다.

 

 

Intro

SwiftData는 새로운 데이터 모델링 및 관리 프레임워크입니다.

SwiftUI처럼 코드에만 집중할 수 있고, Swift 매크로를 사용해 쉽게 API를 사용할 수 있습니다.

SwiftData는 SwiftUI, CloudKit, 위젯같은 다른 플랫폼 기능과도 함께 사용할 수 있습니다.

 

 

Using the model macro

@Model은 Swift 코드에서 모델 스키마 정의를 도와주는 Swift 매크로입니다.

SwiftData 스키마는 일반적인 Swift 코드지만, 메타데이터로 프로퍼티에 annotate 할 수 있습니다.

SwiftData는 이 스키마를 사용해 모델 객체에 기능을 추가할 수 있습니다.

 

 

클래스에 @Model을 추가하는 것만으로도 스키마가 생성됩니다.

SwiftData는 Value 타입을 프로퍼티로 사용할 수 있게 도와줍니다.

여기에는 기본 Value 타입(문자열, 정수, 부동 소수점 등) 뿐만 아니라 구조체, 열거형, Codable 타입도 포함됩니다.

 

 

SwiftData는 Relationship을 이용해 참조 타입을 사용합니다.

모델 타입의 Collections을 이용해 모델 타입 간에 링크를 만들 수 있습니다.

 

 

@Model은 모든 저장 프로퍼티를 업데이트 하고,

@Attribute와 @Relationship을 이용해 스키마 구축 방식을 정할 수 있습니다.

  • @Attribute : add uniqueness constraints
  • @Relationship : control the choice of inverses and specify delete propagation rules.

@Transient를 사용하면 프로퍼티를 제외시킬 수 있습니다.

 

 

아래는 예시입니다.

name을 유니크한 속성으로 변경하고,

bucketList에 @Relationship을 추가해서 Trip이 삭제되면 함께 삭제되도록 구현했습니다.

 

 

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

 

 

Working with your data

ModelContainer와 ModelContext는 SwiftData의 두 가지 중요한 객체입니다.

 

ModelContainer

ModelContainer는 모델 타입에 대한 영속성(persistent backend)을 제공합니다.

지정할 모델 타입 리스트를 지정하면 ModelContainer를 생성할 수 있습니다.

스키마를 설정해 기본 설정으로 사용할 수도 있고, configurations과 마이그레이션 옵션을 통해 커스텀도 가능합니다.

 

 

configurations을 사용하면 URL, CloudKit 및 그룹 컨테이너 Identifier, 마이그레이션 옵션을 변경할 수 있습니다.

 

 

ModelContext

ModelContext는 모델의 모든 변경 사항을 관찰하고, 이에 대한 많은 작업(update 추적, fetch, save, undo) 인터페이스를 제공합니다.

ModelContainer를 설정하면 ModelContext에서 데이터를 가져오고 저장할 수 있습니다.

 

 

SwiftUI에서는 일반적으로 View에서 ModelContext를 사용합니다.

 

 

View 계층 외부에서는 ModelContainer에서 context를 요청하거나, 특정 ModelContainer에 대한 새로운 ModelContext 를 인스턴스화할 수 있습니다.

 

 

Fetching Data

SwiftData는 #Predicate와 FetchDescriptor, SortDescriptor를 사용합니다.

 

 

Predicate

Predicate는 iOS 17에서 새로 나온 Swift native 타입이며 Swift 매크로를 이용합니다. (많은 코드가 자동 완성됨)

 

 

위 예시에서 볼 수 있듯이, Swift 언어를 이용해 다양한 제약을 설정할 수 있습니다.

 

 

FetchDescriptor

이러한 제약은 FetchDescriptor를 이용해 조건에 맞는 데이터만 fetch할 수 있습니다.

fetch를 할 때는 위 세 개를 포함해 여러 기능을 제공합니다.

 

 

SortDescriptor

fetch를 할 때 정렬을 하고 싶다면 SortDescriptor를 사용하면 됩니다.

SortDescriptor는 Swift 타입과 keypath를 지원하며, 가져온 데이터를 정렬할 기준을 설정할 수 있습니다.

 

 

SwiftData Base Operations

SwiftData는 ModelContext로 데이터 생성, 삭제, 저장, 변경 연산을 할 수 있습니다.

 

모델 객체를 생성한 후 Context에 삽입하여 업데이트 추적 및 영속성(persistance)와 같은 SwiftData 기능을 사용할 수 있습니다.

context 메서드인 insert, delete, save로 쉽게 연산할 수 있습니다.

 

 

@Model은 ModelContext가 변경사항을 자동으로 추적하여 다음 저장 작업에 포함될 수 있도록 와줍니다.

 

 

이와 관련된 더 자세한 내용은 WWDC23 - Dive deeper into SwiftData에서 다룹니다.

 

Use SwiftData with SwiftUI

SwiftData는 SwiftUI를 염두해두고 개발되었기 때문에 SwiftUI에서 쓰기 쉽습니다.

 

 

예를 들어, @Qeury를 이용하면 데이터베이스에 저장된 모든 항목을 쉽게 로드하고 필터링할 수 있습니다.

 

 

SwiftData 덕분에 SwiftUI는 @Published 없이도 프로퍼티의 변경 사항을 자동으로 Refresh 합니다.

 

 

SwiftUI와 SwiftData의 내용은 WWDC23 - Build an app with SwiftData에서 다룹니다.

 

 

Wrap-up

SwiftData는 Swift를 최고 수준으로 지원하도록 설계된 새로운 데이터 관리 프레임워크입니다.

Swift 매크로를 이용해 코드 사용이 쉽도록 설계되었습니다.

 

더 자세한 내용은 WWDC23 - Model you schema with SwiftData와 WWDC23 - Migrate to SwiftData에서 다룹니다.

 

감사합니다.

 

참고

https://developer.apple.com/wwdc23/10187


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

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

공감 댓글 부탁드립니다.

 

 

반응형