서론
WWDC23에 새로운 데이터 관리 프레임워크가 나왔습니다.
저는 개인 프로젝트에 CoreData를 자주 사용하고 있는데 학습하고 사용하는게 쉬운 편이 아니라
SwiftData가 이 단점을 해소시켜줄 수 있을지 궁금했습니다 ㅎ
Meet SwiftData는 9분이라는 짧은 길이의 영상이므로 직접 보시는 것도 추천 드립니다.
참고로 SwiftData 영상은 총 5개로 순서는 아래와 같습니다.
- Meet SwiftData
- Build an app with SwiftData, Migrate to SwiftData
- Model your schema with SwiftData
- 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
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.