동기화된 Realm 구성 및 열기 - Node.js SDK
이 페이지의 내용
동기화된 Realms
각각 로컬 데이터 사본을 가진 여러 기기 간에 데이터를 자동으로 동기화하도록 영역을 구성할 수 있습니다. 동기화된 영역은 로컬 전용 영역과 다른 구성을 사용하며 동기화 프로세스를 처리하기 위해 Atlas App Services 백엔드가 필요합니다.
애플리케이션은 오프라인 상태에서도 항상 로컬에서 동기화된 영역 객체를 생성, 수정 및 삭제 수 있습니다. 네트워크 연결이 가능할 때마다 Realm SDK 는 애플리케이션 서버 에 대한 연결을 열고 다른 클라이언트와 변경 사항을 동기화합니다. Atlas Device Sync 프로토콜 및 서버 측 운영 변환은 일부 변경 사항이 오프라인에서 발생했거나 순서대로 수신되지 않은 경우에도 영역 의 완전히 동기화된 모든 인스턴스가 정확히 동일한 데이터를 볼 수 있도록 보장합니다.
팁
동기화 구성 및 사용 방법 알아보기
Realm 앱 에서 동기화 를 설정하다 하는 방법을 포함하여 동기화된 Realm에 대한 자세한 내용은 Atlas Device Sync 개요를 참조하세요.
전제 조건
Node.js 애플리케이션에서 Flexible Sync로 영역을 구성하기 전에 다음을 수행하세요.
백엔드에서 Flexible Sync를 활성화합니다. 클라이언트 애플리케이션에서 사용하려면 먼저 백엔드에서 Flexible Sync를 구성해야 합니다.
클라이언트 프로젝트에서 사용자를 인증합니다.
동기화된 Realm 열기
Device Sync를 구현하는 첫 번째 단계는 동기화된 Realm을 여는 것입니다. 다음 정보는 Flexible Sync를 사용하는 앱과 관련이 있습니다. 기존 앱에서 이전 파티션 기반 동기화를 사용 하는 경우 파티션 기반 동기화 Realm 열기 를 참조하세요. 아직 결정하지 않았거나 어떤 것을 사용할지 잘 모르겠다면 동기화 모드 선택 페이지를 참조하세요.
Flexible Sync를 사용하여 영역 을 열려면 Realm.open() 을 호출합니다. SyncConfiguration 객체 를 정의하는 sync
속성 을 포함해야 하는 ConfigurationWithSync 객체 를 전달합니다. SyncConfiguration에는 user
및 flexible:true
를 포함해야 합니다.
const realm = await Realm.open({ schema: [TaskSchema, TeamSchema], sync: { user: app.currentUser, flexible: true, }, });
기본값 으로 Realm 은 반환하기 전에 서버 의 모든 데이터를 동기화합니다. 배경 에서 데이터를 동기화 하려면 오프라인 상태에서 동기화된 Realm 열기 섹션을 참조하세요.
중요
Flexible Sync에는 구독이 필요합니다.
구독을 하나 이상 추가할 때까지 Flexible Sync 영역을 사용할 수 없습니다. 구독을 추가하는 방법을 알아보려면 구독 추가를 참조하세요 .
특정 경로에서 동기화된 Realm 열기
버전 realm@11.6.0
의 새로운 기능
AppConfig.baseFilePath 및 Realm.Configuration.path 사용 클라이언트 장치에서 Realm 및 메타데이터 파일이 저장되는 위치를 제어할 수 있습니다.
이렇게 하려면 <AppProvider>.baseFilePath
을(를) 설정합니다. baseFilePath
이(가) 설정되지 않은 경우 현재 작업 디렉토리가 사용됩니다. <RealmProvider>.sync.path
을(를) 설정하여 더 많은 제어를 할 수도 있습니다.
const app = new Realm.App({ id: APP_ID, baseFilePath: customPath }); const user = await app.logIn(Realm.Credentials.anonymous()); const realm = await Realm.open({ schema: [Car], sync: { flexible: true, user, }, });
baseFilePath
이 설정된 경우 메타데이터는 항상 <baseFilePath>/mongodb-realm/
에 저장됩니다. baseFilePath
설정되지 않은 경우 메타데이터는 <Realm.defaultPath>/mongodb-realm
에 저장됩니다.
Realm 파일이 정확히 저장되는 위치는 Realm.Configuration.path 설정 방법에 따라 달라질 수 있습니다.
Realm.Configuration.path
설정되지 않았고baseFilePath
이(가) 설정되었습니다. Realm 파일은baseFilePath
에 저장됩니다.Realm.Configuation.path
상대경로로 설정되어 있습니다. Realm 파일이baseFilePath
을(를) 기준으로 저장됩니다.Realm.Configuration.path
절대 경로입니다. Realm 파일은Realm.Configuration.path
에 저장됩니다.
오프라인 상태에서 동기화된 Realm 열기
Realm 애플리케이션이 사용자를 인증하면 사용자의 자격 증명을 캐시합니다. 기존 사용자 자격 증명을 확인하여 로그인 흐름을 우회하고 캐시된 사용자에 액세스할 수 있습니다. 이 기능을 사용하여 오프라인에서 영역을 열 수 있습니다.
참고
최초 로그인 시에는 네트워크 연결이 필요합니다.
사용자가 앱에 가입하거나 클라이언트의 기존 계정으로 처음으로 로그인하는 경우 클라이언트가 네트워크에 연결되어 있어야 합니다. 캐시된 사용자 자격 증명을 확인하면 오프라인에서 영역을 열 수 있지만 이는 사용자가 이전에 온라인 상태에서 로그인한 적이 있는 경우에만 가능합니다.
// Log user into your App Services App. // On first login, the user must have a network connection. const getUser = async () => { // If the device has no cached user credentials, log in. if (!app.currentUser) { const credentials = Realm.Credentials.anonymous(); await app.logIn(credentials); } // If the app is offline, but credentials are // cached, return existing user. return app.currentUser!; };
다음 하위 섹션에서는 오프라인 상태에서 백그라운드 동기화를 사용하여 Realm에 액세스하는 방법을 보여줍니다. 이렇게 하려면 캐시된 사용자와 OpenRealmBehaviorConfiguration 객체를 사용합니다.
동기화 구성 내에서 선택적 newRealmFileBehavior
및 existingRealmFileBehavior
필드를 OpenRealmBehaviorConfiguration
객체로 설정하여 백그라운드 동기화를 활성화합니다.
중요
Flexible Sync 구성과 파티션 기반 동기화 구성 모두에 오프라인 로그인이 지원됩니다.
백그라운드 동기화를 사용하여 즉시 또는 Flexible Sync 또는 이전 파티션 기반 동기화를 사용하여 시간 초과가 경과한 후 Realm을 열 수 있습니다.
파티션 기반 동기화는 오래된 동기화 모드입니다. 애플리케이션에서 파티션 기반 동기화를 사용하는 방법에 대한 자세한 내용은 파티션 기반 동기화 - Node.js SDK 페이지를 참조하세요.
백그라운드 동기화로 즉시 열기
사용자 장치가 인터넷에 연결되어 있지 않거나 연결 상태가 확실하지 않은 경우 영역 동작 유형을 openImmediately
로 설정합니다. 이렇게 하면 백그라운드에서 서버의 데이터가 동기화됩니다.
const behaviorConfiguration = { type: "openImmediately", }; const config = { schema: [Car], sync: { user: await getUser(), flexible: true, newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: "openImmediately", }; const config: Realm.Configuration = { schema: [Car], sync: { user: await getUser(), flexible: true, newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
시간 초과 후 백그라운드 동기화로 열기
데이터를 동기화하고 싶지만 사용자가 인터넷에 연결되어 있는지 확실하지 않은 환경인 경우 timeOut
을(를) 지정합니다. 다음 중 하나에 해당하면 자동으로 영역이 열립니다.
제한 시간이 경과되었습니다.
영역이 완전히 다운로드되었습니다.
Realm이 시간 초과 전에 다운로드를 완료하지 않으면 초기 Realm 동기화가 백그라운드에서 계속됩니다.
const behaviorConfiguration = { type: "openImmediately", timeOut: 1000, timeOutBehavior: "openLocalRealm", }; const config = { schema: [Car], sync: { flexible: true, user: await getUser(), existingRealmFileBehavior: behaviorConfiguration, newRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: "openImmediately", timeOut: 1000, timeOutBehavior: "openLocalRealm", }; const config: Realm.Configuration = { schema: [Car], sync: { flexible: true, user: await getUser(), existingRealmFileBehavior: behaviorConfiguration, newRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config);
백그라운드에서 변경 사항 동기화
동기화된 영역이 서버에서 데이터를 다운로드하는 동안 사용자에게 부분 데이터를 표시하기 위해 백그라운드에서 변경 사항을 동기화할 수 있습니다. 이를 통해 사용자 환경이 차단되는 것을 방지합니다. 사용자 기기가 오프라인 상태가 될 수 있는 애플리케이션의 경우 백그라운드에서 변경 사항을 동기화하는 것이 좋습니다. 백그라운드에서 변경 사항을 동기화하려면 동기화된 영역을 동시에 엽니다.
OpenRealmBehaviorConfiguration 객체 를 생성하고 해당 객체의 type
을(를) "openImmediately"
으)로 설정하다 합니다.
const behaviorConfiguration = { type: "openImmediately", };
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, };
SyncConfiguration 객체를 정의하는 속성을 포함해야 하는 구성 객체를 sync
만듭니다. 이 OpenRealmBehaviorConfiguration
객체를 SyncConfiguration
의 newRealmFileBehavior
및 existingRealmFileBehavior
필드 값으로 설정합니다.
const config = { schema: [DogSchema], sync: { user: app.currentUser, partitionValue: "MyPartitionValue", // The behavior to use when this is the first time opening a realm. newRealmFileBehavior: behaviorConfiguration, // The behavior to use when a realm file already exists locally, // i.e. you have previously opened the realm. existingRealmFileBehavior: behaviorConfiguration, }, };
const config: Realm.Configuration = { schema: [DogSchema], sync: { user: app.currentUser!, partitionValue: "MyPartitionValue", // The behavior to use when this is the first time opening a realm. newRealmFileBehavior: behaviorConfiguration, // The behavior to use when a realm file already exists locally, // i.e. you have previously opened the realm. existingRealmFileBehavior: behaviorConfiguration, }, };
마지막으로 Realm.open() 을 호출하여 동기화된 영역 을 엽니다. 이렇게 하면 동기화 세션 이 생성되고 배경 에서 서버 의 기존 데이터를 다운로드하기 시작합니다.
const realm = await Realm.open(config);
시간 초과 후 비동기 작업 취소
버전 12.0.0의 새로운 기능.
BaseSyncConfiguration 객체에서 cancelWaitsOnNonFatalErrors
속성을 지정할 수 있습니다.
true
인 경우 제한 시간이 경과하면 Node.js SDK 가 업로드 또는 다운로드 대기와 같은 비동기 작업을 취소합니다. AppConfiguration 에서 이 옵션의 시간 제한을 정의할 수 있습니다. 예시 는 앱 클라이언트에 대한 시간 초과 구성을 참조하세요.
값을 지정하지 않으면 이 속성의 기본값은 false
입니다.
const config = { schema: [Doggie], sync: { flexible: true, user: app.currentUser, // When `true`, upload and download waits are canceled on any // error, such as a timeout, instead of just a fatal error. // You can provide an optional timeouts property in milliseconds. cancelWaitsOnNonFatalError: true, }, };
const config: Realm.Configuration = { schema: [Doggie], sync: { flexible: true, user: app.currentUser!, // When `true`, upload and download waits are canceled on any // error, such as a timeout, instead of just a fatal error. // You can provide an optional timeouts property in milliseconds. cancelWaitsOnNonFatalError: true, }, };