---
# System prepended metadata

title: Swift Data
tags: ["\U0001F4BB WWDC 스터디"]

---

<h1><center> Swift Data </center></h1>

###### tags: `💻 WWDC 스터디`
> [color=#724cd1][name=데릭]
> [WWDC2023-SwiftData-김종권님블로그](https://ios-development.tistory.com/1403)
> [WWDC2023-SwiftData](https://developer.apple.com/videos/play/wwdc2023/10187/)


> WWDC 2023 Session 중 하나인 `Swift Data`에 대해 알아보자

## 개요 

- Swift 매크로가 제공하는 표현식을 제공한다. 
- @Model 키워드로 사용
- iOS 17+ 이후 버전부터 제공한다.
- SwiftData는 즉시 사용할 수 있도록 기본적인 Value Type 프로퍼티를 포함하고 있다.
    - 기본 타입(String, Int, Double,...)
    - Collection 타입(Array, Set, Dictionary)
    - 기타(Struct, Codable)

- SwiftData 모델은 타입을 관계로 참조한다.
    - 모델 타입간에 Link를 만들수 있다.

### @Model 
1. import SwiftData로 모듈을 임폴트 한다. 
2. SwiftData로 사용하는 클래스 객체 바로 위에 @Model키워드를 선언한다.

```swift 
import SwiftData

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

### MetaData(@Model, @Attribute, @Relationship)
1. @Model: SwiftData 모델임을 선언한다.
2. @Attribute: 고유성 제약 조건을 추가하는 것을 가능하도록 한다.
3. @Relationship을 사용하여 모델간의 Link 동작을 변경할 수 있다.
4. Transient macro를 사용하여 SwiftData에 특정 프로퍼티를 포함하지 않도록 지시할 수 있다.

#### @Attribute

```swift 
import SwiftData

@Model 
class Trip {
    @Attribute(.unique) var name: String
    var destination: String
    var endDate: Date
    var startDate: Date
    
    var bucketList: [BucketListItem]? = []
    var livingAccommdation: LivingAccommodation?
}
```
- @Attribute(.unique)를 지정하고 싶은 변수 앞에 추가하여 유니크함을 지정한다.


#### @Relationship

```swift 
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 livingAccommdation: LivingAccommodation?
}
```

- @Relationship(.cascade)을 사용하여 이 변수가 삭제될 때마다 SwiftData에 관련 항목을 모두 삭제하도록 지시하는 설정이다.

#### ModelContainer

- Model 타입에 관한 영구적인 Backend를 제공한다(스키마를 지정하기만 하면, Config와 옵션들을 커스텀화할 수 있다.)
- 지정하려는 모델 유형 목록을 지정하기만 하면 모델 컨테이너 생성이 가능하다.
- 컨테이너 설정이 되면 ModelContext로 데이터를 가져오고 저장할 준비가 완료된다. 

**ModelContainer 생성자의 파라미터에 타입과 config 값을 넘겨서 컨테이너 생성이 가능하다**

```swift 
import SwiftData

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

**SwiftUI에서는 .modelContainer()로 바로 사용도 가능하다.**
```swift 
import SwiftData
import SwiftUI

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

#### ModelContext

- 모델에 대한 모든 변경 사항을 관찰하고 이에 대해 작동할 많은 작업을 제공한다.
- 업데이트 추적, 데이터 로드, 변경사항 저장, 변경사항을 취소할 수 있는 인터페이스를 제공한다. 

**SwiftUI에서 SwiftData 사용**

```swift 
import SwiftData
import SwiftUI

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