[SwiftUI] Swift Data 활용하기

·2024년 4월 21일
0
post-thumbnail

Swift Data

Swift Data는 애플에서 사용하던 Core Data를 쉽고 간단하게 바꾼 것 이다. 2023년에 공개되어 자료가 많이 부족하지만 그럼에도 불구하고 쉽고 편리하게 사용할 수 있다. 이게 나오기 전까지는 CoreData를 사용했다. 하지만 CoreData는 안정성, 연동성, 편의성이 많이 떨어졌다. 그래서 나온것이 SwiftData이다. 모델생성도 쉽고 빠르고 사용하는 것도 빠르다.

Swift Data 활용하기

Swift Data 모델 생성

Swift Data에서 모델은 추가적인 도구와 파일 생성 없이 @Model만 붙여준다면 모델 생성이 가능하다. 코드를 살펴보자.

import SwiftData
import SwiftUI

@Model
class Item {
    @Attribute(.unique) var id = UUID()
    var timestamp: Date
    var title: String
    var content1: String
    var content2: String
    var expenses: Int
    var income: Int
    var lock: Bool
    

    init(id: UUID = UUID(), timestamp: Date, title: String, 
    content1: String, content2: String, expenses: Int, income: Int, 
    lock: Bool) {
        self.id = id
        self.timestamp = timestamp
        self.title = title
        self.content1 = content1
        self.content2 = content2
        self.expenses = expenses
        self.income = income
        self.lock = lock
    }
    
}

이코드는 나의 다이어리 앱에서 사용한 모델이다. 위에 Import SwiftData와 @Model을 통해 바로 모델을 생성할 수 있다.

Model Container 생성

Model Container는 데이터 모델의 영구적인 관리를 담당하는데 이는 데이터베이스 역할을 한다.SwiftUI 환경에서는 Model Container를 뷰에 환경에 설정되도록 할 수 있다.

@main
struct MDApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: [Item.self])
    }
}

모델 컨테이너 조회 및 사용

생성된 Model Container는 Model Context를 가져와 사용한다. swift ui에서는 @Environment를 사용하여 간단하게 Model Context를 가져온다. Model Context는 모델의 변화를 연결해주는 역할을 한다.

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext

@Query사용

swiftUI 뷰에서 모델 객체를 쿼리하기 위한 @Query 매크로를 제공한다. @Query로 SwiftData에 의해 관리되는 객체를 읽는다. @Query는 데이터가 변경될 때마다 SwiftUI 뷰가 계속해서 동기화되도록 한다.

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var items: [Item]

여기서는 @query가 swift data의 모든 item객체를 읽어온다.

Create

이제 값을 생성한다. 일기 앱에서는 일기를 적고 저장하는 역할이다. 저장하는 것은 매우 간단하다. 내가 장고를 했었는데 그것과 달리 save할 필요도 없다.

 func addItem() {
            // 새로운 Item을 생성하고 modelContext에 추가합니다.
            let newItem = Item(timestamp: birthDate, title: newTitle, content1: newContent1,content2: newContent2,  expenses: totalPrice(from: newContent1), income: totalPrice1(from: newContent1), lock: newlock)
            modelContext.insert(newItem)
    }
    

이렇게 추가할 수 있다.
insert로 modelcontext에 넣어준다면 저장이 완료된다.

Update

업데이트는 더 간단하다.

func updateItem() {
            item.title = newTitle
            item.expenses = totalPrice(from: newContent1)
            item.content1 = newContent1
            item.content2 = newContent2
            item.income = totalPrice1(from: newContent1)
            item.timestamp = newDate
            item.lock = newlock
    }

이렇게 등호로 연결만 해주면 바로 수정이 되어 저장된다. 하지만 이 값을 조회하러 와야하는데 이때는 foreach를 사용해서 값에 접근해야한다.

UpdateView에 원래 값을 보여주기 위해서

  .task {
            self.newTitle = item.title
            newContent1 = item.content1
            newExpenses = String(item.expenses)
            newContent2 = item.content2
            newIncome = String(item.income)
            newDate = item.timestamp
            newlock = item.lock
        }

task를 활용해서 미리 저장된 값으로 변경해주었다.

delete

func deleteItems(offsets: IndexSet) {
            for index in offsets {
                       let itemToDelete = sortedItems[index]
                       modelContext.delete(itemToDelete)
                   }
    }

위 코드는 리스트에서 인덱스를 확인해서 삭제하는 방법이다.

 .onDelete(perform: deleteItems)

이렇게 foreach구문에 이 코드만 추가해주면 간단하게 삭제할 수 있다.

Preview에서 활용

프리뷰에서 에러가 뜨는 경우를 보았다. 그 경우 코드를 추가하여 해결할 수 있다.

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .modelContainer(for: Item.self,  inMemory: true)
    }
}

inMemory: true는 데이터를 메모리에만 저장하고 디스크에는 저장하지 않는 것이다. 데이터를 임시저장할때 사용한다.

후기

Swift Data는 작년에 나온 최신 기술이여서 아직 많은 자료들이 있지는 않지만 그럼에도 쉽게 구현할 수 있을 만큼 쉽고 간단하다. 애플 공식문서에는 더 많은 내용이 있는데 조금 더 심화적으로 활용할 수 있게 더 알아봐야겠다.

Swift Data 활용한 앱
https://velog.io/@tenedict/SwiftUI-다이어리-만들기-1앱-기획-및-회고-애플-디벨로퍼-아카데미-NC1

profile
싸산

0개의 댓글