Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

Realm 객체 모델 - SwiftUI

이 페이지의 내용

  • 개념: 객체 모델 및 관계
  • 객체 모델을 UI에 바인딩
  • SwiftUI 뷰를 위한 데이터 변환
  • 새 객체 정의
  • 프로젝션 정의

SwiftUI 의 모델링 데이터는 Swift SDK 와 동일한 객체 모델 및 관계 개념을 기반으로 합니다. Realm Swift SDK 데이터 모델링 개념에 익숙하지 않은 경우 Realm 객체 모델 정의 - Swift SDK 를 참조하세요.

MVVM(Model-View-ViewModel) 디자인 패턴 은 뷰 코드에서 모델을 추상화하는 뷰 모델 생성을 주창합니다. Realm 을 사용하면 확실히 이 작업을 수행할 수 있지만, Swift SDK 는 SwiftUI Views에서 직접 데이터로 쉽게 작업할 수 있는 도구를 제공합니다. 이러한 도구에는 다음이 포함됩니다.

  • 기본 관찰 가능 객체에 대한 바인딩을 생성하는 속성 래퍼

  • 특정 뷰에서 사용할 수 있도록 기본 모델 객체를 프로젝트 하고 변환하는 클래스입니다.

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 {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var personId = ""
@Persisted var company = "MongoDB"
@Persisted var businessUnit = BusinessUnitEnum.engineering
@Persisted var profileImageUrl: URL?
@Persisted 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 {
@Persisted(primaryKey: true) var _id: UUID
@Persisted var name = ""
@Persisted var breed = ""
@Persisted var weight = 0
@Persisted var favoriteToy = ""
@Persisted var profileImageUrl: URL?
@Persisted var dateLastUpdated = Date()
@Persisted(originProperty: "dogs") var person: LinkingObjects<Person>
var firstLetter: String {
guard let char = name.first else {
return ""
}
return String(char)
}
}

다음도 참조하세요.

Realm 객체 모델 정의에 대한 자세한 내용은 다음을 참조하세요.

가상의 DoggoDB 앱 에는 사용자 프로필 보기가 있습니다. 이 뷰에는 사람에 대한 일부 세부 정보가 표시되지만 Person 모델의 모든 속성이 필요하지는 않습니다. 원하는 세부 정보만 포함된 프로젝션 을 만들 수 있습니다. 성의 첫 번째 이니셜만 사용하도록 lastName 속성 을 수정할 수도 있습니다.

class Profile: Projection<Person> {
@Projected(\Person.firstName) var firstName // Passthrough from original object
@Projected(\Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property
@Projected(\Person.personId) var personId
@Projected(\Person.businessUnit) var businessUnit
@Projected(\Person.profileImageUrl) var profileImageUrl
@Projected(\Person.dogs) var dogs
}

원본 Person 객체 대신 프로필 보기에서 이 프로젝션을 사용할 수 있습니다.

클래스 프로젝션은 SwiftUI 속성 래퍼와 함께 작동합니다.

돌아가기

모델 데이터