Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

동기화된 Realm 구성 및 열기 - .NET SDK

이 페이지의 내용

  • 동기화된 Realms
  • 동기화 Realms과 비동기화 Realms 비교
  • 동기화된 Realm과 동기화되지 않은 Realm 간 변환
  • 동기화된 Realms
  • 동기화된 Realm 열기
  • 온라인 상태에서 동기화된 Realm 열기
  • 오프라인 상태에서 동기화된 Realm 열기
  • AppConfiguration으로 시간 초과 구성하기
  • Realm 범위 지정
  • 클래스 하위 집합

각각 로컬 데이터 사본을 가진 여러 기기 간에 데이터를 자동으로 동기화하도록 영역을 구성할 수 있습니다. 동기화된 영역은 로컬 전용 영역과 다른 구성을 사용하며 동기화 프로세스를 처리하기 위해 Atlas App Services 백엔드가 필요합니다.

애플리케이션은 오프라인 상태에서도 항상 로컬에서 동기화된 영역 객체를 생성, 수정 및 삭제 수 있습니다. 네트워크 연결이 가능할 때마다 Realm SDK 는 애플리케이션 서버 에 대한 연결을 열고 다른 클라이언트와 변경 사항을 동기화합니다. Atlas Device Sync 프로토콜 및 서버 측 운영 변환은 일부 변경 사항이 오프라인에서 발생했거나 순서대로 수신되지 않은 경우에도 영역 의 완전히 동기화된 모든 인스턴스가 정확히 동일한 데이터를 볼 수 있도록 보장합니다.

동기화 구성 및 사용 방법 알아보기

Atlas App Services App에서 동기화를 설정하는 방법을 포함하여 Realm Mobile Sync에 대한 자세한 내용은 장치 간 데이터 동기화 - .NET SDK를 참조하세요.

동기화된 영역은 동기화되지 않은 로컬 영역과 몇 가지 점에서 다릅니다:

  • 동기화된 영역은 백엔드 App Services App과 변경 사항을 동기화하려고 시도하지만, 비동기화 영역은 동기화를 시도하지 않습니다.

  • 동기화된 영역은 인증된 사용자가 액세스할 수 있지만, 동기화되지 않은 영역은 사용자 또는 인증 개념이 없습니다.

동기화되지 않은 영역에서 동기화된 영역으로 또는 그 반대로 데이터를 복사할 수는 있지만, 동기화되지 않은 영역은 동기화할 수 없습니다.

동기화되지 않은 영역 을 동기화된 영역 으로 변환하려면 로컬 전용 앱을 동기화가 활성화된 앱으로 마이그레이션에 설명된 프로세스 를 따르세요. .NET SDK 는 동기화되지 않은 Realm의 데이터를 동기화 영역 에 복제할 수 있는 WriteCopy() 메서드도 제공합니다. 자세한 내용 은 동기화되지 않은 Realm에서 동기화된 Realm으로 마이그레이션을 참조하세요.

참고

파티션 기반 동기화만 해당

이 방법은 비동기화 영역과 파티션 기반 동기화 간의 변환만 지원합니다. 앱에서 Flexible Sync를 사용하는 경우 영역의 객체를 수동으로 반복하고 다른 영역으로 복사해야 합니다.

동기화된 영역 을 열려면 인증된 사용자 객체 가 있어야 합니다. 초기 User 인스턴스 를 얻으려면 Atlas App Services 백엔드 에 대해 인증해야 하며, 이를 위해서는 사용자가 처음 로그인할 때 기기가 온라인 여야 합니다. 초기 인증 이 완료되면 오프라인 상태에서도 기존 사용자를 조회 할 수 있습니다.

참고

사용자가 앱에 처음 로그인할 때 영역을 비동기적 으로 열어 백그라운드 스레드를 통해 서버에서 기기로 데이터를 동기화해야 합니다. 초기 동기화 가 끝난 후 Realm을 동시에 열어 앱이 오프라인 상태에서 작동하도록 할 수 있습니다.

동기화된 영역을 여는 일반적인 절차는 다음과 같습니다.

  1. 사용자 인증하기

  2. 동기화 구성 생성하기

  3. 구성과 동기화된 사용자의 영역 열기

인증 시 장치의 sync_metadata.realm 파일에 사용자 자격 증명을 캐시합니다.

인증 후 동기화 영역을 열면 로그인 절차를 우회하고 이미 생성한 것과 동일한 동기화 구성을 사용하여 동기화 영역 열기로 바로 이동할 수 있습니다.

캐시된 자격 증명을 사용하면 다음을 수행할 수 있습니다.

  • 에 있는 데이터와 동기화된 영역을 즉시 엽니다. 이 방법은 오프라인 또는 온라인에서 사용할 수 있습니다.

  • 앱에서 변경 사항을 다운로드한 후 동기화된 영역을 엽니다. 이를 위해서는 사용자가 인터넷에 연결되어 있어야 합니다.

온라인 상태에서 동기화된 영역을 여는 단계는 다음과 같습니다.

  1. 앱 코드는 사용자를 인증하는 과정을 안내합니다.

  2. 사용자 객체 를 포함하는 FlexibleSyncConfiguration 객체 를 생성합니다.

  3. 영역 () 메서드를 호출하여 동기화된 Realm을 엽니다.

  4. FlexibleSyncConfiguration에 초기 구독 이 포함되어 있지 않은 경우 구독을 추가합니다.

다음 코드는 이러한 단계를 보여줍니다.

var app = App.Create("myRealmAppId");
var user = await app.LogInAsync(Credentials.Anonymous());
Realm realm;
var config = new FlexibleSyncConfiguration(user)
{
PopulateInitialSubscriptions = (realm) =>
{
var allTasks = realm.All<MyTask>();
realm.Subscriptions.Add(allTasks, new SubscriptionOptions { Name = "allTasks" });
}
};
try
{
realm = await Realm.GetInstanceAsync(config);
}
catch (Exception ex)
{
Console.WriteLine($@"Error creating or opening the
realm file. {ex.Message}");
}

위의 예에서 코드는 GetInstanceAsync() 을(를) 호출하여 비동기적 으로 영역을 여는 방법을 보여줍니다. GetInstance() 메서드를 호출하여 Realm을 동기적 으로 열 수도 있습니다.

var synchronousRealm = Realm.GetInstance(config);

사용자가 인증되면 사용자가 로그오프할 때까지 User 객체가 기기에 유지됩니다. 이렇게 하면 앱이 기존 사용자를 검색 하고 오프라인 상태에서 동기화된 영역을 열 수 있습니다. 오프라인 상태에서 발생하는 변경 사항은 기기가 앱에 다시 연결되면 SDK에 동기화됩니다.

다음 코드는 기존 User 객체가 있는지 확인하는 방법을 보여줍니다. 아무 것도 발견되지 않으면 에 설명된 프로세스를 사용하여 사용자를 얻습니다. 기기에 이미 user 있는 경우 해당 사용자와 동기화된 영역이 열립니다.

var app = App.Create("myRealmAppId");
Realms.Sync.User user;
FlexibleSyncConfiguration config;
Realm realm;
if (app.CurrentUser == null)
{
// App must be online for user to authenticate
user = await app.LogInAsync(Credentials.Anonymous());
config = new FlexibleSyncConfiguration(user);
realm = Realm.GetInstance(config);
// Go on to add or update subscriptions and use the realm
}
else
{
// This works whether online or offline
// It requires a user to have been previously authenticated
user = app.CurrentUser;
config = new FlexibleSyncConfiguration(user);
realm = Realm.GetInstance(config);
// Go on to add or update subscriptions and use the realm
}

앱 연결을 세부적으로 제어하려면 AppConfiguration 객체 에서 SyncTimeoutOptions 를 설정하다 수 있습니다. 다음과 같은 동기화 시간 초과 속성을 설정하다 수 있습니다.

  • ConnectTimeout: 연결이 완전히 설정될 때까지 허용되는 시간입니다.

  • ConnectionLingerTime: 모든 세션이 중단된 후 연결을 열린 상태로 유지하는 데 걸리는 시간입니다.

  • PingKeepAlivePeriod: 각 하트비트 핑 메시지 사이의 시간입니다.

  • PongKeepAliveTimeout: 연결이 끊어졌다고 결론을 내리기 전에 하트비트 핑에 대한 응답을 기다리는 시간입니다.

  • FastReconnectLimit: 이전 연결이 끊어진 후 새 연결이 '빠른 재연결'로 간주되기까지의 시간입니다.

AppConfiguration configuration = new AppConfiguration("myRealmAppId")
{
SyncTimeoutOptions = new SyncTimeoutOptions()
{
ConnectTimeout = TimeSpan.FromMinutes(2),
ConnectionLingerTime = TimeSpan.FromSeconds(30),
PingKeepAlivePeriod = TimeSpan.FromMinutes(1),
PongKeepAliveTimeout = TimeSpan.FromMinutes(1),
FastReconnectLimit = TimeSpan.FromMinutes(1),
},
};

Realm 인스턴스는 네이티브 리소스가 확보되도록 IDisposable 을(를) 구현합니다. 특히 백그라운드 스레드에서 Realm 객체를 사용한 후 즉시 처리해야 합니다. 이를 수행하는 가장 간단한 방법은 using 문을 사용하여 Realm 객체를 선언하거나 using (...) 문으로 영역과 상호 작용하는 코드를 래핑하는 것입니다.

config = new PartitionSyncConfiguration("myPart", user);
using (var realm = Realm.GetInstance(config))
{
var allItems = realm.All<Item>();
}

단일 메서드 외부에서 Realm 객체를 공유해야 하는 경우 Dispose() 메서드를 호출하여 해당 상태를 관리해야 합니다.

realm.Dispose();

참고

영역을 삭제하면 해당 인스턴스와 연결된 모든 객체가 무효화되므로 일반적으로 백그라운드 스레드에서만 영역을 삭제해야 합니다. 예를 들어 메인 스레드에서 영역 객체를 데이터 바인딩하는 경우 Dispose() 을(를) 호출해서는 안 됩니다.

기본적으로 모든 RealmObject 클래스는 Realm에 저장됩니다. 일부 시나리오에서는 저장되는 클래스를 제한해야 할 수 있으며, 이는 RealmConfiguration 객체의 스키마 속성을 사용하여 수행할 수 있습니다. 다음 코드는 Realm에 저장하려는 두 개의 클래스를 지정하는 방법을 보여줍니다.

var config = new RealmConfiguration()
{
Schema = new Type[]
{
typeof(AClassWorthStoring),
typeof(AnotherClassWorthStoring)
}
};

돌아가기

앱에 동기화 추가