Realm 객체 모델 정의 - React Native SDK
이 페이지의 내용
객체 유형 정의
Realm 객체 유형을 정의하려면 Realm.Object
을(를) 확장하는 클래스를 생성하세요. schema
라는 정적 속성에서 유형의 name
및 properties
을(를) 정의합니다. 타입의 이름은 영역의 객체 유형들 사이에서 고유해야 합니다.
class Book extends Realm.Object { static schema = { name: 'Book', properties: { name: {type: 'string', indexed: true}, price: 'int?', }, }; }
class Book extends Realm.Object<Book> { name!: string; price?: number; static schema: ObjectSchema = { name: 'Book', properties: { name: {type: 'string', indexed: true}, price: 'int?', }, }; }
그런 다음 영역 을 열 때 클래스 자체를 구성 객체 의 스키마 속성 에 전달할 수 있습니다.
지원되는 속성 유형
Realm 객체의 모든 속성에는 강력하게 정의된 데이터 유형이 있습니다. 속성 유형은 기본 데이터 유형이거나 동일한 영역에 정의된 객체 유형일 수 있습니다. 또한 유형은 속성에 단일 값이 포함되어 있는지 또는 값 목록이 포함되어 있는지 여부를 지정합니다.
필드에 기본 값 유형 목록이 포함되도록 지정하려면 유형 이름에 []
을(를) 추가하세요.
지원되는 속성 유형 목록은 속성 유형을 참조하세요.
객체 속성 정의
객체 유형의 속성을 정의하려면 properties
필드 아래에 속성의 이름과 데이터 유형을 나타내는 키-값 쌍을 만듭니다.
다음 스키마는 _id
make
, model
및 miles
속성이 있는 Car
유형을 정의합니다.
선택적 속성 설정
속성을 선택 사항으로 표시하려면 객체 구문을 사용하여 optional
을(를) true
(으)로 설정합니다. 유형에 ?
물음표를 추가하는 간단한 구문을 사용할 수도 있습니다. 기본 유형에 가장 적합합니다. 더 복잡한 유형에는 더 구체적인 객체 구문을 사용해야 합니다.
다음 Person
클래스 예에서 age
및 birthday
속성은 모두 선택 사항입니다.
class Person extends Realm.Object<Person> { name!: string; age?: number; birthday?: Date; static schema: ObjectSchema = { name: 'Person', properties: { name: 'string', age: { type: 'int', optional: true, }, // You can use a simplified syntax instead. For // more complicated types, use the object syntax. birthday: 'date?', }, }; }
프라이머리 키 설정
속성을 객체 유형의 프라이머리 키로 지정하려면 스키마의 primaryKey
필드를 속성 이름으로 설정하세요.
참고
기본 키 는 객체를 고유하게 식별하는 속성입니다. Realm은 기본 키 속성을 자동으로 인덱싱 하므로 기본 키를 기반으로 객체를 효율적으로 읽고 수정할 수 있습니다.
객체 유형에 프라이머리 키가 있는 경우 해당 유형의 모든 객체에는 영역에 있는 동일한 유형의 객체 중 고유한 값을 갖는 프라이머리 키 속성이 포함되어야 합니다. 객체 유형에는 프라이머리 키가 하나만 있을 수 있습니다. 해당 유형의 객체를 영역에 추가한 후에는 해당 객체 유형의 프라이머리 키 속성을 변경할 수 없으며 객체의 프라이머리 키 값을 수정할 수 없습니다.
다음 Task
클래스 예에서는 _id
속성을 프라이머리 키로 지정합니다.
1 class Task extends Realm.Object { 2 static schema = { 3 name: 'Task', 4 properties: { 5 _id: 'int', 6 name: 'string', 7 priority: 'int?', 8 progressMinutes: 'int?', 9 assignee: 'Person?', 10 }, 11 primaryKey: '_id', 12 }; 13 }
1 class Task extends Realm.Object<Task> { 2 _id!: number; 3 name!: string; 4 priority?: number; 5 progressMinutes?: number; 6 assignee?: Person; 7 age?: number; 8 9 static schema: ObjectSchema = { 10 name: 'Task', 11 properties: { 12 _id: 'int', 13 name: 'string', 14 priority: 'int?', 15 progressMinutes: 'int', 16 assignee: 'Person?', 17 }, 18 primaryKey: '_id', 19 }; 20 }
속성 인덱싱
특정 속성을 기반으로 읽기 작업을 자주 실행하는 경우 속성을 인덱싱하여 성능을 최적화할 수 있습니다. Realm은 문자열, 정수, 부울, Date
, UUID
및 ObjectId
속성에 대한 인덱싱을 지원합니다.
참고
인덱스를 사용하면 쓰기 시간이 약간 느려지고 스토리지 및 메모리 오버헤드가 늘어나는 대신 특정 읽기 작업의 속도가 크게 향상됩니다. Realm은 인덱스를 디스크에 저장하므로 영역 파일이 더 커집니다. 각 인덱스 항목은 최소 12바이트입니다. 인덱스 항목의 순서는 효율적인 동등성 매치 및 범위 기반 쿼리 작업을 지원합니다.
지정된 속성을 색인화하려면 속성의 indexed
필드를 true
(으)로 설정합니다.
다음 Book
클래스 예에서는 name
속성에 대한 인덱스를 정의합니다.
1 class Book extends Realm.Object { 2 static schema = { 3 name: 'Book', 4 properties: { 5 name: {type: 'string', indexed: true}, 6 price: 'int?', 7 }, 8 }; 9 }
1 class Book extends Realm.Object<Book> { 2 name!: string; 3 price?: number; 4 5 static schema: ObjectSchema = { 6 name: 'Book', 7 properties: { 8 name: {type: 'string', indexed: true}, 9 price: 'int?', 10 }, 11 }; 12 }
Full Text Search 인덱스 설정
Realm은 표준 인덱스 외에도 문자열 속성에 대한 FTS(Full-Text Search) 인덱스도 지원합니다. 표준 인덱스 유무에 관계없이 문자열 필드를 쿼리할 수 있지만 FTS 인덱스를 사용하면 여러 단어와 구를 검색하고 나머지는 제외할 수 있습니다.
FTS 인덱스 쿼리에 대한 자세한 내용은 Full Text Search를 참조하세요.
FTS 인덱스를 만들려면 인덱싱된 유형을 'full-text'
로 설정합니다. 이를 통해 속성에 대한 전체 텍스트 쿼리가 가능합니다. 다음 예제에서는 name
속성의 인덱싱된 유형을 'full-text'
으)로 설정합니다.
class Book extends Realm.Object<Book> { name!: string; price?: number; static schema: ObjectSchema = { name: 'Book', properties: { name: {type: 'string', indexed: 'full-text'}, price: 'int?', }, }; }
기본 속성 값 설정
기본값을 정의하려면 속성 값을 type
필드와 default
필드가 있는 객체로 설정하세요.
다음 Car
클래스 예에서는 기본값이 0
인 miles
속성을 정의합니다.
버전 11.1.0의 새로운 기능
Realm.js v11.1.0 이상에서는 함수를 사용하여 아래 예의 timestamp
속성과 같은 동적 기본값을 정의할 수 있습니다.
1 class Car extends Realm.Object { 2 static schema = { 3 name: 'Car', 4 properties: { 5 make: 'string', 6 model: 'string', 7 miles: {type: 'int', default: 0}, 8 timestamp: { 9 type: 'int', 10 default: () => Math.round(new Date().getTime() / 1000), 11 }, 12 }, 13 }; 14 }
1 class Car extends Realm.Object { 2 make!: string; 3 model!: string; 4 miles: number = 0; 5 timestamp: number = Math.round(new Date().getTime() / 1000); 6 7 static schema: ObjectSchema = { 8 name: 'Car', 9 properties: { 10 make: 'string', 11 model: 'string', 12 miles: {type: 'int', default: 0}, 13 timestamp: { 14 type: 'int', 15 default: () => Math.round(new Date().getTime() / 1000), 16 }, 17 }, 18 }; 19 }
속성 재매핑
Realm에 저장된 것과 다른 속성 이름을 코드에 사용하려면 코드에 표시되는 속성 이름으로 mapTo
을(를) 설정하세요.
다음 Employee
클래스 예에서는 first_name
속성을 firstName
에 다시 매핑합니다.
1 class Employee extends Realm.Object { 2 static schema = { 3 name: 'Employee', 4 properties: { 5 _id: 'string', 6 first_name: {type: 'string', mapTo: 'firstName'}, 7 }, 8 primaryKey: '_id', 9 }; 10 }
1 class Employee extends Realm.Object { 2 _id!: string; 3 first_name!: string; 4 5 static schema: ObjectSchema = { 6 name: 'Employee', 7 properties: { 8 _id: 'string', 9 first_name: {type: 'string', mapTo: 'firstName'}, 10 }, 11 primaryKey: '_id', 12 }; 13 }
비대칭 객체 정의
Flexible Sync를 사용 중이고 기기에서 Atlas 데이터베이스로 컬렉션을 단방향으로 동기화해야 하는 경우 객체 스키마에서 asymmetric
속성을 설정할 수 있습니다.
class WeatherSensor extends Realm.Object { static schema = { name: 'WeatherSensor', // sync WeatherSensor objects one way from your device // to your Atlas database. asymmetric: true, primaryKey: '_id', properties: { _id: 'objectId', deviceId: 'string', temperatureInFahrenheit: 'int', barometricPressureInHg: 'float', windSpeedInMph: 'float', }, }; }
class WeatherSensor extends Realm.Object<WeatherSensor> { _id!: Realm.BSON.ObjectId; deviceId!: string; temperatureInFahrenheit!: number; barometricPressureInHg!: number; windSpeedInMph!: number; static schema: ObjectSchema = { name: 'WeatherSensor', // sync WeatherSensor objects one way from your device // to your Atlas database. asymmetric: true, primaryKey: '_id', properties: { _id: 'objectId', deviceId: 'string', temperatureInFahrenheit: 'int', barometricPressureInHg: 'float', windSpeedInMph: 'float', }, }; }
realm@12.2.1
버전에서 변경됨
JS SDK 버전 12.2.0 이하에서는 비대칭 객체에서 Realm.Object
유형으로 링크할 수 없습니다. SDK 버전 12.2.1 이상에서는 비대칭 객체가 내장된 객체 외에도 Realm.Object
유형에 연결할 수 있습니다.
참고
비대칭 객체 읽기 시도
비대칭 객체는 읽을 수 없습니다. 비대칭 객체를 쿼리하려고 하면 '오류: 비대칭 클래스는 쿼리할 수 없습니다.'라는 오류가 발생합니다.
데이터 수집에 대해 자세히 알아보려면 Atlas로 데이터 스트리밍을 읽어보세요.
비정형 데이터 정의
버전 realm@12.9.0
의 새로운 기능
JavaScript SDK 버전 12.9.0부터 mixed
속성 내에 혼합 데이터 컬렉션을 저장 수 있습니다. 이 기능 을 사용하면 엄격한 데이터 모델 을 정의하지 않고도 JSON 또는 MongoDB 문서와 같은 복잡한 데이터 구조를 모델링할 수 있습니다.
구조화되지 않은 데이터 는 예상 스키마 를 쉽게 준수하지 않는 데이터로, 개별 데이터 클래스를 모델링하기가 어렵거나 비실용적입니다. 예를 예시 앱 에 매우 가변적인 데이터나 런타임에 구조를 알 수 없는 동적 데이터가 있을 수 있습니다.
컬렉션을 혼합 속성 에 저장하면 Device Sync 사용 시 성능 동기화를 포함하여 기능을 희생하지 않고도 유연성을 확보할 수 있습니다. 혼합되지 않은 컬렉션 과 동일한 방식으로 작업할 수 있습니다.
혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.
혼합 컬렉션의 변경React 을 쿼리 하고 이에 대응할 수 있습니다.
개별 혼합 컬렉션 요소를 찾고 업데이트 할 수 있습니다.
그러나 혼합된 컬렉션에 데이터를 저장하는 것은 구조화된 스키마 를 사용하거나 JSON blob을 단일 string 속성 으로 직렬화하는 것보다 성능이 떨어집니다.
앱 에서 구조화되지 않은 데이터를 모델링하려면 스키마 에서 적절한 속성을 혼합 유형으로 정의합니다. 그런 다음 이러한 mixed
속성을 혼합 요소의 목록 또는 사전 컬렉션 으로 설정하다 수 있습니다. mixed
속성 은 설정하다 나 내장된 객체 를 보유 할 수 없습니다 .
팁
유형을 알 수 없지만 각 값에 고유 식별자가 있는 경우 혼합 데이터 유형의 맵을 사용합니다.
유형을 알 수 없지만 객체의 순서가 의미 있는 경우 혼합 데이터 유형 목록을 사용합니다.
TypeScript 및 필수 속성
Realm.create() 를 사용 하여 Realm 객체를 생성하는 것이 좋지만 new
객체 모델의 클래스에 연산자를 사용할 수도 있습니다.
new
을(를)사용하는 경우 Realm.Object
확장 시 필수 속성과 함께 클래스를 일반 클래스로 추가해야 합니다. 이를 통해 필수 필드가 정의되지 않은 경우의 유형 오류를 포함하여 객체 모델에 대한 전체 TypeScript 지원이 가능해집니다.
class Book extends Realm.Object<Book, 'name' | 'store'> { name!: string; store!: string; price?: number; static schema: ObjectSchema = { name: 'Book', properties: { name: {type: 'string', indexed: true}, store: 'string', price: 'int?', }, }; }