KoreaMango 나무

[WWDC23] Meet SwiftData 본문

WWDC

[WWDC23] Meet SwiftData

KoreaMango 2023. 8. 1. 00:14

오랜만에 블로그 글을 씁니다 :)

 

이번 WWDC2023에서 SwiftData가 새롭게 나왔죠?

SwiftData에 대해서 알아보고자 글을 작성합니다.

영상을 한번 본 입장으로 먼저 스포를 해드리자면, 데이트베이스 생각하시면 돼요!

 

그럼 바로 WWDC 2023의 Meet SwiftData에 대해 설명해드리겠습니다.

 

# Meet SwiftData

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

 

Meet SwiftData - WWDC23 - Videos - Apple Developer

SwiftData is a powerful and expressive persistence framework built for Swift. We'll show you how you can model your data directly from...

developer.apple.com

## SwiftData란 무엇인가?

  • SwiftData데이터 모델링 및 관리를 위한 강력한 프레임워크입니다.
  • SwiftUI 처럼 Import를 사용해서 프레임워크를 사용할 수 있습니다.

 

## @Model 매크로를 사용하는 방법

@Model은 Swift 코드에서 모델의 스키마를 정의하는 데 도움이 되는 새로운 Swift 매크로입니다.

import SwiftData

@Model
class Trip {
    var name: String
    var destination: String
    var endDate: Date
    var startDate: Date
 
    var bucketList: [BucketListItem]? = []
    var livingAccommodation: LivingAccommodation?
}

클래스 위에 @Model을 넣어 스키마를 생성합니다

 

SwiftData의 모델은 애플리케이션 스키마의 진실의 소스이며 영구적인 경험을 주도합니다. 이 경험의 일부는 클래스의 저장 프로퍼티를 영구 프로퍼티로 전환합니다.

SwiftData는 기본적으로 속성으로 즉시 사용할 수 있도록 값 유형 속성을 조정합니다. 이러한 속성에는 string, int 및 float와 같은 기본 값 유형이 포함됩니다.

또한 컬렉션을 포함하여 구조체, 열거형 및 코딩 가능한 유형과 같은 보다 복잡한 값 유형을 포함할 수 있습니다.

SwiftData 모델은 타입을 관계로 참조합니다. 관계 및 모델 유형 컬렉션을 사용하여 모델 유형 간에 링크를 만들 수 있습니다.

@Model은 유형에 저장된 모든 속성을 수정합니다. SwiftData가 속성의 메타데이터를 사용하여 스키마를 구축하는 방식에 영향을 미칠 수 있습니다.

@Attribute를 사용하면 고유성 제약 조건을 추가할 수 있습니다. (슈퍼키?)

@Relationship을 사용하여 반전 선택을 제어하고 전파 규칙 삭제를 지정할 수 있습니다. 이는 모델 간의 링크 동작을 변경합니다.

@Transient 매크로를 사용하여 SwiftData에 특정 속성을 포함하지 않도록 지시할 수 있습니다.

 

그럼 계속 사용법에 대해 알아보도록 하겠습니다.

import SwiftData

@Model
class Trip {
    @Attribute(.unique) var name: String
    var destination: String
    var endDate: Date
    var startDate: Date
 
    @Relationship(.cascade) var bucketList: [BucketListItem]? = []
    var livingAccommodation: LivingAccommodation?
}

이름에 @Attribute를 추가하고 unique를 지정할 수 있습니다. 기본키?

버킷리스트에 @Relationship을 추가하고 여행이 삭제될 때마다 Swift Data에 관련 버킷 목록 항목을 모두 삭제하도록 지시할 수 있습니다.

SwiftData 모델링에 대해 자세히 알아보려면 "SwiftData로 스키마 모델링" 세션을 확인하면 됩니다.

 

 

Model your schema with SwiftData - WWDC23 - Videos - Apple Developer

Learn how to use schema macros and migration plans with SwiftData to build more complex features for your app. We'll show you how to...

developer.apple.com

 

## ModelContainer 및 ModelContext에 대해

### Model Container

ModelContainer는 모델 타입에 대한 영구 백엔드를 제공합니다. 스키마를 지정하기만 하면 기본 설정을 사용하거나, configurations 및 migration 옵션으로 사용자 정의할 수 있습니다.

import SwiftData

let container = try ModelContainer([Trip.self, LivingAccommodation.self])

저장하려는 모델 타입 리스트를 지정함으로써 ModelContainer 를 만들 수 있습니다.

import SwiftData

let container = try ModelContainer(for: [Trip.self, LivingAccommodation.self],
																	configurations: ModelConfiguartion(url: URL("path"))

컨테이너를 추가로 사용자 지정하려는 경우, configurations을 사용하여 URL, CloudKit 및 그룹 컨테이너 식별자, 마이그레이션 옵션을 변경할 수 있습니다.

컨테이너가 설정되면 ModelContext로 데이터를 가져오고 저장할 준비가 된 것입니다.

import SwiftUI

@main
struct TripsApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(
            for: [Trip.self, LivingAccommodation.self]
        )
    }
}

또한 SwiftUI의 view 및 scene modifiers를 사용하여 컨테이너를 설정하고 보기의 환경에서 자동으로 설정되도록 할 수 있습니다.

 

### Model Context

Model Context는 모델에 대한 모든 변경 사항을 관찰하고 이에 대해 작동할 많은 작업을 제공합니다. 업데이트를 추적하고, 데이터를 가져오고, 변경 사항을 저장하고, 변경 사항을 실행 취소할 수 있는 인터페이스입니다.

import SwiftUI

struct ContextView : View {
    @Environment(\.modelContext) private var context
}

SwiftUI에서는 일반적으로 모델 컨테이너를 생성한 후 뷰의 환경에서 ModelContext를 가져옵니다.

import SwiftData

let context = ModelContext(container)

뷰 계층 구조 외부에서 공유된 main actor bound context를 제공하도록 Model Container에 요청하거나, 주어진 Model Container에 대한 새 Context를 간단히 인스턴스화할 수 있습니다.

### Fetching your data

SwiftData는 Predicate 및 FetchDescriptor와 같은 새로운 Swift 기본 타입과 Swift의 기본 SortDescriptor에 대한 상당한 개선의 이점을 제공합니다.

iOS 17의 새로운 기능인 Predicate는 기본 Swift 타입과 함께 작동하며 강력한 타입의 구성을 위해 Swift 매크로를 사용합니다. NSPredicate에 대한 완전히 타입 확인된 최신 대체품입니다. 자동 완성과 같은 Xcode 지원으로 술어 구현도 쉽습니다.

다음은 Sample Trip 앱에 대한 술어 작성의 몇 가지 예입니다. 먼저 목적지가 뉴욕인 모든 여행을 지정할 수 있습니다

let tripPredicate = #Predicate<Trip> { 
		$0.destination == "New York" &&
		$0.name.contains("birthday") &&
		$0.startDate > tody
}

생일에 대한 여행으로 쿼리 범위를 좁힐 수 있다. 또한 미래에 계획된 여행에만 관심이 있음을 지정할 수 있습니다.

let descriptor = FetchDescriptor<Trip> (
	sortBy: SortDescriptor(\\Trip.name),
	predicate: tripPredicate
)

let trips = try context.fetch(descriptor)

가져오려는 여행을 결정한 후에는 새로운 FetchDescriptor 유형을 사용하고 Model Context에 해당 여행을 가져오도록 지시할 수 있습니다. FetchDescriptor와 함께 작동하는 Swift SortDescriptor는 기본 Swift 유형 및 키 경로를 지원하기 위해 몇 가지 업데이트를 받고 있으며 SortDescriptor를 사용하여 가져온 여행을 구성할 순서를 지정할 수 있습니다. FetchDescriptor는 SwiftData 쿼리를 맞춤화하는 다른 많은 방법을 제공합니다. 술어 및 정렬 외에도 프리페치할 관련 개체를 지정하고 결과 수를 제한하고 결과에서 저장되지 않은 변경 사항을 제외하는 등의 작업을 수행할 수 있습니다.

var myTrip = Trip(name: "Birthday Trip", destination: "New York")

context.insert(myTrip)
context.delete(myTrip)
context.save()

또한 SwiftData를 사용하면 ModelContext를 사용하여 이러한 작업을 구동함으로써 데이터를 쉽게 생성, 삭제 및 변경할 수 있습니다. 다른 Swift 클래스와 마찬가지로 모델 객체를 생성한 후 컨텍스트에 삽입하고 변경 추적 및 지속성과 같은 SwiftData 기능을 사용할 수 있습니다. 영속 개체를 삭제하는 것은 ModelContext에 개체를 삭제 표시하도록 지시하는 것만큼 쉽습니다. ModelContext에 개체를 저장하고 영구 컨테이너에 커밋하도록 요청하여 이러한 변경 사항과 기타 보류 중인 변경 사항을 저장할 수 있습니다. 모델 객체의 속성 값을 변경하는 것은 평소처럼 속성 설정자를 사용하는 것만큼 간단합니다.

 

Model 매크로는 저장된 속성을 수정하여 ModelContext가 변경 사항을 자동으로 추적하고 다음 저장 작업에 포함하도록 돕습니다. SwiftData 컨테이너 및 컨텍스트와 작동 방식에 대해 자세히 알아보려면 "Dive Deeper into SwiftData" 세션을 확인하세요

Dive deeper into SwiftData - WWDC23 - Videos - Apple Developer

 

Dive deeper into SwiftData - WWDC23 - Videos - Apple Developer

Learn how you can harness the power of SwiftData in your app. Find out how ModelContext and ModelContainer work together to persist your...

developer.apple.com

 

## Using SwiftData with SwiftUI

SwiftData는 SwiftUI를 염두에 두고 구축되었으며 함께 사용하는 것이 더 쉬울 수 없습니다. SwiftUI는 SwiftData 사용을 시작하는 가장 쉬운 방법입니다. SwiftData 컨테이너 설정, 데이터 가져오기 또는 보기 업데이트 구동 여부에 관계없이 이러한 프레임워크를 직접 통합하는 API를 구축했습니다.

새로운 SwiftUI 장면 및 보기 수정자는 SwiftData 애플리케이션 구축을 시작하는 가장 쉬운 방법입니다. SwiftUI를 사용하여 데이터 저장소를 구성하고, 옵션을 변경하고, 실행 취소를 활성화하고, 자동 저장을 전환할 수 있습니다. SwiftUI는 환경에서 모델 컨텍스트를 전파합니다.

import SwiftUI

struct ContentView: View  {
    @Query(sort: \\.startDate, order: .reverse) var trips: [Trip]
    @Environment(\\.modelContext) var modelContext
    
    var body: some View {
       NavigationStack() {
          List {
             ForEach(trips) { trip in 
                 // ...
             }
          }
       }
    }
}

설정한 후 데이터 사용을 시작하는 가장 쉬운 방법은 새로운 @Query 속성 래퍼입니다. 한 줄의 코드로 데이터베이스에 저장된 모든 항목을 쉽게 로드하고 필터링할 수 있습니다.

SwiftData는 모델링된 속성에 대해 완전히 새로운 관찰 가능 기능을 지원합니다. SwiftUI는 관찰된 속성에 대한 변경 사항을 자동으로 새로 고칩니다. SwiftUI와 SwiftData는 함께 작동하여 매력적이고 강력한 앱을 빌드하는 데 도움을 줍니다. "SwiftData로 앱 빌드" 세션에서 이러한 프레임워크를 함께 사용하는 방법에 대해 자세히 알아보세요.

Build an app with SwiftData - WWDC23 - Videos - Apple Developer

 

Build an app with SwiftData - WWDC23 - Videos - Apple Developer

Discover how SwiftData can help you persist data in your app. Code along with us as we bring SwiftData to a multi-platform SwiftUI app...

developer.apple.com

 

SwiftData는 데이터 관리를 위한 강력하고 새로운 솔루션으로, Swift의 기능을 최고 수준으로 지원하도록 설계되었습니다. Swift의 새로운 매크로 시스템을 사용하여 전적으로 코드에 집중합니다. @model을 사용하여 스키마를 설정하고 모델 컨테이너로 지속성 환경을 구성합니다.

지속성, 실행 취소 및 다시 실행, iCloud 동기화, 위젯 개발 등을 쉽게 활성화할 수 있습니다. SwiftUI의 원활한 통합을 활용하여 SwiftData를 앱에 즉시 빌드하십시오.

# Other

SwiftData | Apple Developer Documentation

 

SwiftData | Apple Developer Documentation

Write your model code declaratively to add managed persistence and automatic iCloud sync.

developer.apple.com

Adopting SwiftData for a Core Data app | Apple Developer Documentation

 

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

 

# 마무리

이렇게 Meet SwiftData 세션 정리를 끝냈는데요. 매크로, 스위프트 데이터가 인상 깊었어요.

매크로를 이용해 간결하게 데이터 스키마를 만드는 것이 놀랍더라구요. 이렇게 심플하고 발전해 나아가는 iOS가 좋은 것 같아요.

 

Model Container와 Model Context를 마스터 하기 위해서는 직접 앱에 적용해보는 것이 도움될 것 같아요. 그래서 WWDC 2023에 올라온 SwiftData 관련 세션을 보고 마무리 작업으로 앱을 만들어 보려합니다 :) 

 

그리고 제가 개발할 때 사용하는 MVVM 패턴의 Model은 구조체 였는데,

이번 SwiftData의 스키마 형식의 영구 프로퍼티를 만들기 위한 Model은 클래스라 구분이 필요할 것 같아요 :)

 

Model에 대한 개념을 다시 잡고 가는 것도 좋을 것 같네요 :)

 

 

'WWDC' 카테고리의 다른 글

[WWDC2021] Building DSLs in Swift  (0) 2022.10.19
[WWDC 2022] Swift Student Challenge 후기  (1) 2022.06.27
[WWDC 2020] Vision  (0) 2022.05.13