<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 } ```