목차
- SwiftData란?
- SwiftData 구조
- Schema
- ModelContainer
- ModelContext
- CRUD
- Bindable
이번 포스팅은 WWDC23에서 발표된 SwiftData 를 알아보려고 합니다.
바로 알아봅시다!
SwiftData란?
SwiftData란 애플에서 제공하는 로컬 저장소 프레임워크입니다. iOS 앱을 만들때 로컬 저장소로 많이 사용하던 프레임워크로는 애플의 퍼스트파티 프레임워크인 Core Data, 서드파티 라이브러리로인 Realm 등이 있었습니다. 저는 Realm만 써왔었는데, Core Data 보다 속도가 2배 빠르고 사용법이 간단해 빠르게 적용하기 좋아 Core Data 대신 Realm을 채택했었습니다. SwiftData는 Realm 대신 채택할 이유가 생길까요? 한번 SwiftData에 대해 알아보겠습니다.
SwiftData 구조
SwiftData의 구조를 도식화해보면 위와 같습니다.
Schema
Swift 코드로 작성된 모델 클래스를 통해 Schema를 정의합니다. 이러한 모델 클래스는 속성, 관계, 제약조건을 포함하는 엔티티 형태가 됩니다.
ModelContainer
모델 컨테이너는 모델 컨텍스트와 DB사이의 브로커입니다.
주어진 스키마를 통해 데이터베이스를 생성하고, 디스크 간 읽기 및 쓰기를 관리합니다. 그러나 직접적으로 데이터를 쓰거나 업데이트, 삭제, 변경하지 않습니다. 이는 모델 컨텍스트가 수행하고 컨테이너는 이를 데이터베이스에 전달하는 역할만 합니다. 그리고 iCloud 동기화도 처리할 수 있습니다. 아래처럼 컨테이너 객체를 직접 만들어서 전달할 수도 있습니다.
ModelContext
모델 컨텍스트는 실질적으로 응용 프로그램과 소통하며 CRUD를 담당합니다. 변경사항을 저장하고 업데이트하며 이 변경사항을 추적할 수 있습니다.
Create
뷰에서 위와같이 Environment의 modelContext 키패스를 사용해 모델 컨텍스트 인스턴스를 생성합니다.
Read
@Query
는 contex에서 원하는 모델을 쉽게 꺼내올 수 있도록 해주는 프로퍼티 래퍼입니다. Query 매크로의 파라미터로 filter와 sort를 지정할 수있습니다. filter는 Predicate를 사용해 필터링할 조건을 설정할 수 있습니다. 타입을 제네릭으로 전달하고, 조건식을 클로저로 전달하는 방식으로 사용됩니다.
Update
user.name = "바꿀 이름"
모델 인스턴스의 값에 직접적으로 변경하면 바로 반영됩니다.
Delete
@Query(sort: \Todo.creationDate) var todos: [Todo]
context.delete(todos[index])
context의 delete 메소드를 통해 삭제할 모델 인스턴스를 지정해주면 바로 삭제됩니다.
Bindable
SwiftUI에는 @Bind
프로퍼티 래퍼를 통해 값 타입의 프로퍼티를 상위 뷰와 하위 뷰를 연결시켜, 변경사항을 공유하고 변경사항을 통해 각 View에 재렌더링할 수 있도록 하는 프로퍼티 래퍼가 있습니다. @Bindable
은 @Bind
와 비슷하지만 클래스 타입에서 사용할 수 있습니다.
SwiftData의 스키마는 Class로 구현이 되어있기 때문에, 하위 뷰에서@Bindable
을 사용해 상위 뷰와 연결시킬 수 있습니다.
참고링크
https://developer.apple.com/videos/play/wwdc2022/110364/
https://zeddios.tistory.com/919
https://www.swiftyplace.com/blog/swiftdata-stack-understanding-containers
'iOS' 카테고리의 다른 글
Swift 메모리 관점에서의 Image (4) | 2024.06.18 |
---|---|
모듈화란? with Tuist (2) | 2024.06.03 |
InjectionIII 라이브러리를 적용하면서 마주한 이슈들 (0) | 2024.05.02 |
Swift 찍먹하기 (1) | 2024.04.23 |
XCode15+ Image Color Assets 관리 방법의 변화 (0) | 2024.03.05 |