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

Realm 객체 스키마 정의 - Flutter SDK

이 페이지의 내용

  • 모델 만들기
  • Realm 가져오기
  • 생성된 파일 부분 지시문 만들기
  • RealmModel 만들기
  • RealmObject 생성
  • 애플리케이션에서 RealmObject 사용
  • Device Sync와 함께 스키마 사용
  • 지원되는 데이터 유형
  • 속성 주석
  • 관계 속성 정의
  • 모델 또는 클래스를 다른 이름에 매핑
  • 비정형 데이터 모델링
  • RealmObject 생성
  • 비대칭 객체 정의

중요

Flutter SDK v2.0.0 생성된 파일에 대한 단절적 변경

Flutter SDK 버전 2.0.0 파일 생성 방식에 영향을 미치는 빌더 업데이트 를 도입합니다. v2.0.0 이상에서는 생성된 모든 파일이 .g.dart 대신 .realm.dart 명명 규칙을 사용합니다.

이는 기존 앱에 대한 호환성이 손상되는 변경 입니다. 기존 앱 을 이전 SDK 버전에서 v2.0.0 이상으로 업그레이드 하는 방법에 대한 자세한 내용은 Flutter SDK v2.0.0 로 업그레이드를 참조하세요.

객체 스키마는 Realm 객체의 속성과 관계를 정의하는 구성 객체입니다. Realm 클라이언트 애플리케이션은 네이티브 클래스로 구현된 객체 스키마를 정의하며, 이때 객체 스키마를 사용하는 해당 언어를 사용합니다.

객체 스키마는 각 속성의 데이터 유형, 속성이 필요한지 여부와 같은 객체 속성에 대한 제약 조건을 지정합니다. 스키마는 또한 영역의 객체 유형 간의 관계를 정의할 수 있습니다.

1

파일 맨 위에 있는 Realm SDK 패키지를 가져옵니다.

schemas.dart
import 'package:realm/realm.dart';
schemas.dart
import 'package:realm_dart/realm.dart';
2

버전 v2.0.0에서 변경됨: 생성된 파일의 이름은 .g.dart .realm.dart 입니다.

4단계에서 생성한 RealmObject 파일을 현재 작업 중인 파일과 동일한 패키지에 포함하도록 부분 지시문을 추가합니다.

schemas.dart
part 'schemas.realm.dart';
3

Realm 스키마 에 대한 모델을 만듭니다. RealmModel 주석을 포함해야 합니다. 클래스 정의의 맨 위에 있습니다.

RealmModel을 사용하여 4단계에서 애플리케이션 전체에서 사용되는 공개 RealmObject를 생성합니다.

모델을 비공개 또는 공개로 설정할 수 있습니다. 모델을 비공개로 설정하고 하나의 파일에 정의할 것을 권장합니다. 비공개로 설정하려면 클래스 이름 앞에 밑줄(_)을 추가하세요.

여러 파일에 걸쳐 스키마를 정의해야 하는 경우 RealmModel을 공개로 설정할 수 있습니다. 모델을 공개로 설정하려면 이름 앞에 달러 기호($)를 붙입니다. 4단계에 설명한 대로 RealmModel에서 RealmObject를 생성하려면 이 작업을 수행해야 합니다.

RealmModel에 필드를 추가합니다. 지원되는 모든 데이터 유형을 추가할 수 있습니다. 속성 주석을 사용하여 추가 동작을 포함합니다.

schemas.dart
@RealmModel()
class _Car {
@PrimaryKey()
late ObjectId id;
late String make;
late String? model;
late int? miles;
}

참고

클래스 이름은 최대 57자의 UTF-8 문자로 제한됩니다.

4

버전 v2.0.0에서 변경됨: 생성된 파일의 이름은 .g.dart .realm.dart 입니다.

애플리케이션에서 사용할 RealmObject를 생성합니다.

dart run realm generate
dart run realm_dart generate

이 명령은 모델 파일과 동일한 디렉토리에 파일을 생성합니다.이 파일은 2단계의 부분 지시문에서 지정한 이름이 있습니다.

생성된 파일 추적

git과 같은 버전 제어 시스템에서 생성된 파일을 추적합니다.

예시

모델 생성 후 파일 구조

.
├── schemas.dart
├── schemas.realm.dart // newly generated file
├── myapp.dart
└── ...rest of application
5

애플리케이션의 이전 단계에서 생성한 RealmObject를 사용합니다. 생성된 파일을 2단계에서 RealmModel을 정의한 패키지에 포함했으므로, RealmModel을 사용해 파일을 가져와서 RealmObject에 액세스합니다.

myapp.dart
import './schemas.dart';
final hondaCivic = Car(ObjectId(), 'Honda', model: 'Civic', miles: 99);

App Services 스키마는 앱이 유지할 수 있는 객체 유형을 각각 정의하는 유효한 객체 스키마의 목록입니다. 영역의 모든 동기화된 객체는 App Services 스키마를 준수해야 합니다.

클라이언트 애플리케이션은 영역을 열 때 객체 스키마를 제공합니다. 영역에 이미 데이터가 포함되어 있으면 이미 스키마가 있는 것이며, 영역이 열리면 Realm은 기존 스키마와 비교하여 클라이언트의 스키마의 유효성을 검사합니다.

다음과 같은 방법으로 App Services 스키마를 정의할 수 있습니다:

스키마에서 MapTo("_id") 주석을 RealmModel의 프라이머리 키와 함께 사용해야 객체 스키마를 App Services와 성공적으로 동기화할 수 있습니다.

@RealmModel()
class _SyncSchema {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
// ... other properties
}

스키마 정의와 애플리케이션에 대해 고려해야 할 접근 방식에 대한 자세한 내용 은 Realm 스키마 생성 문서를 참조하세요.

Realm 스키마는 일부 Realm 특정 유형 외에도 다양한 Dart 언어 데이터 유형을 지원합니다. 지원되는 모든 데이터 유형에 대한 포괄적인 참조는 데이터 유형을 참조하세요.

Realm 객체 모델의 속성에 기능을 추가하려면 주석을 사용합니다. 속성을 null 허용으로 표시하고, 프라이머리 키를 설정하고, 속성을 무시하는 등의 작업을 주석을 사용해 수행할 수 있습니다. 사용 가능한 속성 주석에 대한 자세한 내용은 속성 주석을 참조하세요.

스키마에서 Realm 객체 간의 관계를 정의할 수 있습니다. Realm Flutter SDK는 to-one 관계, to-many 관계, 역관계 및 다른 객체 내의 내장된 객체를 지원합니다. Realm 객체 스키마에서 관계를 정의하는 방법에 대해 자세히 알아보려면 관계를 참조하세요.

MapTo 를 사용할 수 있습니다. 주석을 사용하여 Realm 객체 모델 또는 속성을 Realm의 다른 저장된 이름에 매핑합니다. 이는 다음과 같은 시나리오에서 유용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 명명 규칙이 서로 다른 플랫폼에서 더 쉽게 작업할 수 있습니다. 예를 들면 Device Sync 스키마 속성 이름은 스네이크 표기법을 사용하고, 프로젝트는 카멜 표기법을 사용하는 경우입니다.

  • 마이그레이션을 강제하지 않고 클래스 또는 필드 이름을 변경합니다.

  • 서로 다른 패키지에서 동일한 이름을 가진 여러 모델 클래스를 지원합니다.

  • 클래스 이름이 Realm에서 지정한 57자 제한보다 긴 경우.

Atlas Device Sync를 사용하는 경우 MapTo 주석에 지정한 이름이 영구 App Services 스키마 이름으로 사용됩니다.

@RealmModel()
@MapTo('naval_ship')
class _Boat {
@PrimaryKey()
late ObjectId id;
late String name;
late int? maxKnots;
late int? nauticalMiles;
}
class _Vehicle {
@PrimaryKey()
late ObjectId id;
late String? maybeDescription; // optional value
late double milesTravelled = 0; // 0 is default value
@Ignored()
late String notInRealmModel;
@Indexed()
late String make;
@MapTo('wheels') // 'wheels' is property name in the RealmObject
late int numberOfWheels;
}

버전 2.0.0에 추가 되었습니다.

Flutter SDK 버전 2.0.0 부터 RealmValue 속성 내에 혼합 데이터 컬렉션을 저장 수 있습니다. 이 기능 을 사용하면 엄격한 데이터 모델 을 정의하지 않고도 JSON 또는 MongoDB 문서와 같은 복잡한 데이터 구조를 모델링할 수 있습니다.

구조화되지 않은 데이터 는 예상 스키마 를 쉽게 준수하지 않는 데이터로, 개별 데이터 클래스를 모델링하기가 어렵거나 비실용적입니다. 예를 예시 앱 에 매우 가변적인 데이터나 런타임에 구조를 알 수 없는 동적 데이터가 있을 수 있습니다.

컬렉션을 혼합 속성 에 저장하면 Device Sync 사용 시 성능 동기화를 포함하여 기능을 희생하지 않고도 유연성을 확보할 수 있습니다. 혼합되지 않은 컬렉션 과 동일한 방식으로 작업할 수 있습니다.

  • 혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.

  • 혼합 컬렉션의 변경React 을 쿼리 하고 이에 대응할 수 있습니다.

  • 개별 혼합 컬렉션 요소를 찾고 업데이트 할 수 있습니다.

그러나 혼합된 컬렉션에 데이터를 저장하는 것은 구조화된 스키마 를 사용하거나 JSON blob을 단일 string 속성 으로 직렬화하는 것보다 성능이 떨어집니다.

앱 에서 구조화되지 않은 데이터를 모델링하려면 스키마 에서 적절한 속성을 RealmValue 유형으로 정의합니다. 그런 다음 이러한 RealmValue 속성을 RealmList 또는 RealmValue 요소의 RealmMap 컬렉션 으로 설정하다 수 있습니다. RealmValueRealmSet 또는 내장된 객체 를 나타낼 수 없습니다 .

예를 예시, 변수 이벤트 로그 객체 를 모델링할 때 혼합 데이터 맵이 포함된 RealmValue 를 사용할 수 있습니다.

데이터 모델
// Define class with a `RealmValue` property
@RealmModel()
class _EventLog {
@PrimaryKey()
late ObjectId id;
late String eventType;
late DateTime timestamp;
late String userId;
late RealmValue details;
}
비정형 데이터 생성
realm.write(() {
// Add `eventLog` property data as a map of mixed data, which
// also includes nested lists of mixed data
realm.add(EventLog(ObjectId(), 'purchase', DateTime.now(), 'user123',
details: RealmValue.from({
'ipAddress': '192.168.1.1',
'items': [
{'id': 1, 'name': 'Laptop', 'price': 1200.00},
{'id': 2, 'name': 'Mouse', 'price': 49.99}
],
'total': 1249.99
})));
final eventLog = realm.all<EventLog>().first;
final items = eventLog.details.asMap();
print('''
Event Type: ${eventLog.eventType}
Timestamp: ${eventLog.timestamp}
User ID: ${eventLog.userId}
Details:
Item:
''');
for (var item in items.entries) {
print('${item.key}: ${item.value}');
}
Event Type: purchase
Timestamp: 2024-03-18 13:50:58.402979Z
User ID: user123
Details:
Item:
ipAddress: RealmValue(192.168.1.1)
items: RealmValue([RealmValue({id: RealmValue(1), name: RealmValue(Laptop), price: RealmValue(1200.0)}), RealmValue({id: RealmValue(2), name: RealmValue(Mouse), price: RealmValue(49.99)})])
total: RealmValue(1249.99)

  • 유형을 알 수 없지만 각 값에 고유 식별자가 있는 경우 혼합 데이터 유형의 맵을 사용합니다.

  • 유형을 알 수 없지만 객체의 순서가 의미 있는 경우 혼합 데이터 유형 목록을 사용합니다.

버전 v2.0.0에서 변경됨: 생성된 파일의 이름은 .g.dart .realm.dart 입니다.

Realm 모델을 완성한 후 이를 애플리케이션에서 사용하려면 RealmObject 클래스를 생성해야 합니다.

아래 명령을 실행하여 RealmObjects를 생성합니다.

dart run realm generate
dart run realm_dart generate

이 명령을 실행하면 모델 만들기 섹션에 따라 RealmModel 클래스를 정의한 디렉토리의 새 파일에 공개 클래스가 생성됩니다.

생성된 파일은 .realm.dart로 끝나는 RealmModel 파일과 동일한 기본 이름을 갖습니다. 예를 들어 RealmModel 파일의 이름이 schemas.dart인 경우, 생성된 파일의 이름은 schemas.realm.dart입니다.

참고

생성된 파일을 RealmModel 정의 파일의 부분 지시문에 포함해야 합니다.

schemas.dart
// ...import packages
part 'schemas.realm.dart';
@RealmModel()
// ...model definition

데이터 모델을 관찰하여 변경 사항이 있을 때마다 RealmObjects를 생성하려면 명령에 --watch 플래그를 포함합니다.

dart run realm generate --watch
dart run realm_dart generate --watch

생성기 캐시를 비우려면 명령에 --clean 플래그를 포합니다. 생성기 캐시를 비우면 디버깅 시 유용할 수 있습니다.

dart run realm generate --clean
dart run realm_dart generate --clean

버전 1.5.0의 새로운 기능.

비대칭 객체에는 Flexible Sync가 필요합니다. 비대칭 객체를 정의하려면 ObjectType.asymmetricObject@RealmModel()로 전달합니다.

@RealmModel(ObjectType.asymmetricObject)
class _WeatherSensor {
@PrimaryKey()
@MapTo("_id")
late ObjectId id;
late String deviceId;
late double modtemperatureInFahrenheitel;
late double barometricPressureInHg;
late double windSpeedInMph;
}

Flutter SDK 버전 1.5.0 이하에서는 asymmetricObject 유형에서 RealmObjects로 링크할 수 없습니다. SDK 버전 1.6.0 이상에서는 내장된 객체 유형 외에도 asymmetricObject 유형이 RealmObjects에 연결될 수 있습니다.

참고

비대칭 객체 읽기 시도

비대칭 객체는 읽을 수 없습니다. 비대칭 객체를 쿼리하려고 하면 '오류: 비대칭 클래스는 쿼리할 수 없습니다.'라는 오류가 발생합니다.

데이터 수집에 대해 자세히 알아보려면 Atlas로 데이터 스트리밍을 참조하세요.

돌아가기

모델 데이터