Realm 객체 모델 - SwiftUI
개념: 객체 모델 및 관계
SwiftUI 의 모델링 데이터는 Swift SDK 와 동일한 객체 모델 및 관계 개념을 기반으로 합니다. Realm Swift SDK 데이터 모델링 개념에 익숙하지 않은 경우 Realm 객체 모델 정의 - Swift SDK 를 참조하세요.
객체 모델을 UI에 바인딩
MVVM(Model-View-ViewModel) 디자인 패턴 은 뷰 코드에서 모델을 추상화하는 뷰 모델 생성을 주창합니다. Realm 을 사용하면 확실히 이 작업을 수행할 수 있지만, Swift SDK 는 SwiftUI Views에서 직접 데이터로 쉽게 작업할 수 있는 도구를 제공합니다. 이러한 도구에는 다음이 포함됩니다.
기본 관찰 가능 객체에 대한 바인딩을 생성하는 속성 래퍼
특정 뷰에서 사용할 수 있도록 기본 모델 객체를 프로젝트 하고 변환하는 클래스입니다.
SwiftUI 뷰를 위한 데이터 변환
Realm Swift SDK 는 데이터의 하위 집합을 변환하고 작업할 수 있도록 프로젝션 이라는 특수한 유형의 객체 를 제공합니다. 뷰 모델과 유사한 프로젝션 을 생각해 보세요. 다양한 방법으로 원본 객체의 속성을 전달하거나 변환할 수 있습니다.
패스스루: 프로젝션의 속성 은 원본 객체 와 이름 및 유형이 동일합니다.
이름 바꾸기: 프로젝션의 속성은 원본 객체와 유형이 동일하지만 이름이 다릅니다.
키 경로 확인: 프로젝션된 객체의 특정 속성에 액세스 하려면 이를 사용합니다.
컬렉션 매핑: 일부 컬렉션 유형 을 기본 값 컬렉션 에 매핑할 수 있습니다.
제외: 원래 Realm 객체의 모든 속성이 프로젝션 모델에 정의되어 있지 않습니다. 해당 속성을 변경해도 프로젝션을 관찰할 때 변경 알림이 trigger 되지 않습니다.
프로젝션을 사용하면 Realm의 라이브 객체의 이점을 모두 얻을 수 있습니다.
클래스 프로젝션 객체의 실시간 업데이트
변경 사항 관찰 가능
쓰기 트랜잭션(write transaction)의 속성에 변경 사항 직접 적용 가능
새 객체 정의
Realm 객체는 Object 또는 EmbeddedObject 클래스에서 파생하여 정의할 수 있습니다. 클래스 이름은 Realm의 테이블 이름이 되며 클래스의 속성은 데이터베이스에 유지됩니다. 이렇게 하면 일반 Swift 객체를 사용하는 것처럼 지속형 객체를 사용하는 것이 쉬워집니다.
Realm SwiftUI 문서에서는 가상의 앱인 DoggoDB의 모델을 사용합니다. 이 앱은 반려견을 키우는 직원들의 회사 디렉토리입니다. 이를 통해 사람들은 개에 대한 몇 가지 세부 정보를 다른 직원과 공유할 수 있습니다.
데이터 모델 에는 해당 개인의 개 객체 와 다대다 관계 를 가진 Person 객체 가 포함됩니다. 또한 특수한 Realm Swift SDK 데이터 유형 인 PersistableEnum 을 사용하여 개인의 사업부에 대한 정보를 저장 합니다.
class Person: Object, ObjectKeyIdentifiable { true) var _id: ObjectId (primaryKey: var firstName = "" var lastName = "" var personId = "" var company = "MongoDB" var businessUnit = BusinessUnitEnum.engineering var profileImageUrl: URL? var dogs: List<Dog> } enum BusinessUnitEnum: String, PersistableEnum, CaseIterable { case customerEngineering = "Customer Engineering" case educationCommunityAndDocs = "Education, Community and Docs" case engineering = "Engineering" case financeAndOperations = "Finance and Operations" case humanResourcesAndRescruiting = "Human Resources and Recruiting" case management = "Management" case marketing = "Marketing" case product = "Product" case sales = "Sales" } class Dog: Object, ObjectKeyIdentifiable { true) var _id: UUID (primaryKey: var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() "dogs") var person: LinkingObjects<Person> (originProperty: var firstLetter: String { guard let char = name.first else { return "" } return String(char) } }
프로젝션 정의
가상의 DoggoDB 앱 에는 사용자 프로필 보기가 있습니다. 이 뷰에는 사람에 대한 일부 세부 정보가 표시되지만 Person
모델의 모든 속성이 필요하지는 않습니다. 원하는 세부 정보만 포함된 프로젝션 을 만들 수 있습니다. 성의 첫 번째 이니셜만 사용하도록 lastName
속성 을 수정할 수도 있습니다.
class Profile: Projection<Person> { Person.firstName) var firstName // Passthrough from original object (\ Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property (\ Person.personId) var personId (\ Person.businessUnit) var businessUnit (\ Person.profileImageUrl) var profileImageUrl (\ Person.dogs) var dogs (\}
원본 Person
객체 대신 프로필 보기에서 이 프로젝션을 사용할 수 있습니다.
클래스 프로젝션은 SwiftUI 속성 래퍼와 함께 작동합니다.