동기화된 Realm 구성 및 열기 - .NET SDK
이 페이지의 내용
동기화된 Realms
각각 로컬 데이터 사본을 가진 여러 기기 간에 데이터를 자동으로 동기화하도록 영역을 구성할 수 있습니다. 동기화된 영역은 로컬 전용 영역과 다른 구성을 사용하며 동기화 프로세스를 처리하기 위해 Atlas App Services 백엔드가 필요합니다.
애플리케이션은 오프라인 상태에서도 항상 로컬에서 동기화된 영역 객체를 생성, 수정 및 삭제 수 있습니다. 네트워크 연결이 가능할 때마다 Realm SDK 는 애플리케이션 서버 에 대한 연결을 열고 다른 클라이언트와 변경 사항을 동기화합니다. Atlas Device Sync 프로토콜 및 서버 측 운영 변환은 일부 변경 사항이 오프라인에서 발생했거나 순서대로 수신되지 않은 경우에도 영역 의 완전히 동기화된 모든 인스턴스가 정확히 동일한 데이터를 볼 수 있도록 보장합니다.
팁
동기화 구성 및 사용 방법 알아보기
Atlas App Services App에서 동기화를 설정하는 방법을 포함하여 Realm Mobile Sync에 대한 자세한 내용은 장치 간 데이터 동기화 - .NET SDK를 참조하세요.
동기화 Realms과 비동기화 Realms 비교
동기화된 영역은 동기화되지 않은 로컬 영역과 몇 가지 점에서 다릅니다:
동기화된 영역은 백엔드 App Services App과 변경 사항을 동기화하려고 시도하지만, 비동기화 영역은 동기화를 시도하지 않습니다.
동기화된 영역은 인증된 사용자가 액세스할 수 있지만, 동기화되지 않은 영역은 사용자 또는 인증 개념이 없습니다.
동기화되지 않은 영역에서 동기화된 영역으로 또는 그 반대로 데이터를 복사할 수는 있지만, 동기화되지 않은 영역은 동기화할 수 없습니다.
동기화된 Realm과 동기화되지 않은 Realm 간 변환
동기화되지 않은 영역 을 동기화된 영역 으로 변환하려면 로컬 전용 앱을 동기화가 활성화된 앱으로 마이그레이션에 설명된 프로세스 를 따르세요. .NET SDK 는 동기화되지 않은 Realm의 데이터를 동기화 영역 에 복제할 수 있는 WriteCopy() 메서드도 제공합니다. 자세한 내용 은 동기화되지 않은 Realm에서 동기화된 Realm으로 마이그레이션을 참조하세요.
참고
파티션 기반 동기화만 해당
이 방법은 비동기화 영역과 파티션 기반 동기화 간의 변환만 지원합니다. 앱에서 Flexible Sync를 사용하는 경우 영역의 객체를 수동으로 반복하고 다른 영역으로 복사해야 합니다.
동기화된 Realms
동기화된 영역 을 열려면 인증된 사용자 객체 가 있어야 합니다. 초기 User
인스턴스 를 얻으려면 Atlas App Services 백엔드 에 대해 인증해야 하며, 이를 위해서는 사용자가 처음 로그인할 때 기기가 온라인 여야 합니다. 초기 인증 이 완료되면 오프라인 상태에서도 기존 사용자를 조회 할 수 있습니다.
참고
사용자가 앱에 처음 로그인할 때 영역을 비동기적 으로 열어 백그라운드 스레드를 통해 서버에서 기기로 데이터를 동기화해야 합니다. 초기 동기화 가 끝난 후 Realm을 동시에 열어 앱이 오프라인 상태에서 작동하도록 할 수 있습니다.
동기화된 Realm 열기
동기화된 영역을 여는 일반적인 절차는 다음과 같습니다.
동기화 구성 생성하기
구성과 동기화된 사용자의 영역 열기
인증 시 장치의 sync_metadata.realm
파일에 사용자 자격 증명을 캐시합니다.
인증 후 동기화 영역을 열면 로그인 절차를 우회하고 이미 생성한 것과 동일한 동기화 구성을 사용하여 동기화 영역 열기로 바로 이동할 수 있습니다.
캐시된 자격 증명을 사용하면 다음을 수행할 수 있습니다.
에 있는 데이터와 동기화된 영역을 즉시 엽니다. 이 방법은 오프라인 또는 온라인에서 사용할 수 있습니다.
앱에서 변경 사항을 다운로드한 후 동기화된 영역을 엽니다. 이를 위해서는 사용자가 인터넷에 연결되어 있어야 합니다.
온라인 상태에서 동기화된 Realm 열기
온라인 상태에서 동기화된 영역을 여는 단계는 다음과 같습니다.
앱 코드는 사용자를 인증하는 과정을 안내합니다.
사용자 객체 를 포함하는 FlexibleSyncConfiguration 객체 를 생성합니다.
영역 () 메서드를 호출하여 동기화된 Realm을 엽니다.
다음 코드는 이러한 단계를 보여줍니다.
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);
오프라인 상태에서 동기화된 Realm 열기
사용자가 인증되면 사용자가 로그오프할 때까지 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으로 시간 초과 구성하기
앱 연결을 세부적으로 제어하려면 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 범위 지정
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) } };