Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

동기화 세션 관리 - React Native SDK

이 페이지의 내용

  • 전제 조건
  • 액세스 동기화 세션
  • 동기화 세션 일시 중지 또는 재개
  • 동기화 세션을 일시 중지해야 하는 경우
  • 동기화 세션에 대한 업로드 및 다운로드 진행률 확인
  • 네트워크 연결 확인
  • 멀티플렉싱 동기화 세션

Atlas Device Sync를 사용하면 React Native SDK는 동기화 세션을 사용하여 백그라운드에서 데이터를 Atlas와 동기화합니다. 동기화 세션은 동기화된 영역을 열 때마다 시작됩니다.

동기화 세션을 managed하려면 먼저 다음을 수행해야 합니다.

  1. 동기화된 Realm 열기

  2. 동기화 구독 추가

  3. 동기화된 영역에 대해 useRealm() 후크를 사용하는 구성 요소를 AppProvider, UserProviderRealmProvider 구성 요소로 래핑합니다. 동기화된 Realm 구성 및 열기에 대한 자세한 내용 은 동기화된 영역 열기를 참조하세요.

useRealm() 후크를 사용하여 구성 요소에서 동기화된 영역 에 액세스합니다. 영역의 Realm.syncSession 속성 을 사용하여 동기화 세션 에 액세스합니다.

import React, {useEffect} from 'react';
import {Context} from '../RealmConfig';
const {useRealm} = Context;
function AccessSyncSession() {
const realm = useRealm();
async function workWithSyncSession() {
const {syncSession} = realm;
// Do stuff with sync session...
}
// ...
}

동기화된 영역 을 열면 동기화 세션 이 시작됩니다. Realm의 동기화 세션 을 일시 중지했다가 다시 시작할 수 있습니다. 열려 있는 영역 이 두 개 이상 있는 경우 일시 중지해도 다른 Realm의 동기화 세션에는 영향을 주지 않습니다.

동기화를 일시 중지하려면 Realm.syncSession.pause() 메서드. 동기화를 재개하려면 Realm.syncSession.resume() 메서드.

import React, {useEffect, useState} from 'react';
import {Context} from '../RealmConfig';
const {useRealm} = Context;
function ToggleSyncSession() {
const realm = useRealm();
const [isPaused, setIsPaused] = useState(false);
async function toggleSyncSession() {
if (isPaused) {
await realm.syncSession?.resume();
} else {
await realm.syncSession?.pause();
}
setIsPaused(!isPaused);
}
return (
<Button
title={isPaused ? 'Pause Sync' : 'Unpause Sync'}
onPress={toggleSyncSession}
/>
);
}

대부분의 애플리케이션은 동기화 세션을 수동으로 일시 중지했다가 다시 시작할 필요가 없습니다. 그러나 동기화 세션을 일시 중지하거나 일시 중지해야 하는 몇 가지 상황이 있습니다.

  • 사용자가 특정 조치를 취한 후에만 동기화하려는 경우

  • 하루 중 특정 시간에만 동기화하려는 경우

  • 네트워크 연결이 좋지 않을 때 동기화를 시도하고 싶지 않은 경우

  • 동기화 세션을 명시적으로 강제로 연결하려는 경우

네트워크 연결이 좋지 않은 경우 계속해서 네트워크 연결을 설정하려고 하면 사용자의 장치 배터리가 소모될 수 있습니다.

동기화 세션을 연결하도록 명시적으로 강제하는 경우는 가장 일반적으로 일정 시간 동안 오프라인 상태인 것과 관련이 있습니다. 동기화 클라이언트는 연결을 시도하지만 실패 시 지수 백오프 상태가 됩니다. 클라이언트가 오랫동안 오프라인 상태였다가 즉시 다시 연결되지 않을 수 있습니다. 동기화 세션을 일시 중지했다가 다시 시작하면 명시적으로 연결이 강제로 적용됩니다.

동기화 세션을 일시 중지할 때는 다음 사항에 유의하세요.

  • 클라이언트가 클라이언트 최대 오프라인 시간 보다 오래 오프라인 상태일 수 있는 경우 클라이언트는 동기화를 다시 시작할 수 없으며 클라이언트 재설정을 수행해야 합니다.

  • 동기화 세션을 일시 중지하면 양쪽 방향에서 모두 일시 중지됩니다. 앱이 기기에서 수행하는 변경 사항은 백엔드 동기화되지 않으며, 백엔드 또는 다른 기기에서 변경한 데이터는 기기에 동기화되지 않습니다. 업로드만 일시 중지 또는 다운로드만 일시 중지할 수 있는 방법은 없습니다.

  • 클라이언트가 백엔드와의 동기화를 영구적으로 중지하도록 하려면 동기화 세션을 일시 중지하지 마세요. 동기화를 영구적으로 중지하려면 동기화된 영역의 콘텐츠를 동기화되지 않은 영역에 복사하고 클라이언트에서 동기화되지 않은 영역을 사용합니다.

무기한 또는 월 및 연도 단위의 시간 범위 동안 동기화를 중지하기 위해 동기화를 일시 중지 하지 마세요 . 이 사용 사례에 맞게 기능이 설계되거나 테스트되지 않았습니다. 이러한 방식으로 사용하면 다양한 문제가 발생할 수 있습니다.

동기화 세션 의 업로드 및 다운로드 진행률을 확인하려면 Realm.syncSession.addProgressNotification() 메서드 를 사용하여 진행률 알림을 추가합니다. 메서드.

Realm.syncSession.addProgressNotification() 메서드는 다음 세 가지 매개변수를 사용합니다.

  • direction 매개변수입니다. 데이터 업로드에 대한 알림을 등록하려면 "upload" 로 설정합니다. 데이터 다운로드에 대한 알림을 등록하려면 "download" 로 설정합니다.

  • mode 매개변수입니다. "reportIndefinitely" 로 설정하면 Realm.syncSession.removeProgressNotification() 을 사용하여 콜백이 등록 취소될 때까지 알림이 계속됩니다. 현재 전송 가능한 바이트만 동기화될 때까지 알림을 계속하려면 "forCurrentlyOutstandingWork" 로 설정합니다.

  • 인수가 transferredtransferable 인 콜백 함수 매개 변수입니다. transferred 는 이미 전송된 현재 바이트 수입니다. transferable 은 이미 전송된 총 바이트 수에 전송 대기 중인 바이트 수를 더한 값입니다.

참고

Flexible Sync 진행 상황 알림은 아직 완전히 지원되지 않습니다. Flexible Sync를 사용하는 경우 변경 사항이 통합된 후에만 다운로드가 알림을 보고합니다. 파티션 기반 동기화는 변경 사항 다운로드가 진행되면 지속적인 알림을 제공합니다. 업로드는 두 동기화 모드에서 진행 중인 진행 상황 알림을 보고합니다.

다음 예시에서는 업로드 이벤트를 무기한 수신하기 위해 syncSession 에 콜백을 등록합니다. 이 예제에서는 영역에 쓰기를 수행한 다음 syncSession 알림 콜백을 등록 취소합니다.

import React, {useEffect, useState} from 'react';
import {SyncedRealmContext} from '../RealmConfig';
const {useRealm} = SyncedRealmContext;
import {Text} from 'react-native';
function CheckUploadProgress() {
const realm = useRealm();
const [uploadProgressPercent, setUploadProgressPercent] = useState(0);
useEffect(() => {
const progressNotificationCallback = (transferred, transferable) => {
// Convert decimal to percent with no decimals
// (e.g. 0.6666... -> 67)
const percentTransferred =
parseFloat((transferred / transferable).toFixed(2)) * 100;
setUploadProgressPercent(percentTransferred);
};
// Listen for changes to connection state
realm.syncSession?.addProgressNotification(
Realm.ProgressDirection.Upload,
Realm.ProgressMode.ReportIndefinitely,
progressNotificationCallback,
);
// Remove the connection listener when component unmounts
return () =>
realm.syncSession?.removeProgressNotification(
progressNotificationCallback,
);
// Run useEffect only when component mounts
}, []);
return <Text>Percent Uploaded: {uploadProgressPercent} %</Text>;
}
import React, {useEffect, useState} from 'react';
import {Context} from '../RealmConfig';
const {useRealm} = Context;
import {Text} from 'react-native';
function CheckUploadProgress() {
const realm = useRealm();
const [uploadProgressPercent, setUploadProgressPercent] = useState(0);
useEffect(() => {
const progressNotificationCallback: Realm.ProgressNotificationCallback = (
transferred,
transferable,
) => {
// Convert decimal to percent with no decimals
// (e.g. 0.6666... -> 67)
const percentTransferred =
parseFloat((transferred / transferable).toFixed(2)) * 100;
setUploadProgressPercent(percentTransferred);
};
// Listen for changes to connection state
realm.syncSession?.addProgressNotification(
Realm.ProgressDirection.Upload,
Realm.ProgressMode.ReportIndefinitely,
progressNotificationCallback,
);
// Remove the connection listener when component unmounts
return () =>
realm.syncSession?.removeProgressNotification(
progressNotificationCallback,
);
// Run useEffect only when component mounts
}, []);
return <Text>Percent Uploaded: {uploadProgressPercent} %</Text>;
}

Realm의 오프라인 우선 설계는 연결이 가능할 때 백그라운드에서 데이터가 동기화되므로 일반적으로 현재 네트워크 연결 상태를 확인할 필요가 없음을 의미합니다. 즉, Realm SDK는 서버에 대한 네트워크 연결의 현재 상태를 가져오는 메서드를 제공합니다.

서버 에 대한 연결의 현재 상태 를 확인하려면 Realm.syncSession.isConnected() 를 호출합니다. 이 메서드는 네트워크에 연결되어 있고 동기화 세션 이 활성화된 경우 부울 true 을 반환합니다.

연결 상태 변경을 수신하려면 Realm.syncSession.addConnectionNotification() 을 호출합니다. 네트워크 변경 사항을 처리하는 콜백 함수를 인수로 전달합니다. 리스너의 등록을 취소하려면 동일한 콜백 함수를 Realm.syncSession.removeConnectionNotification()에 전달합니다.

import React, {useState, useEffect} from 'react';
import {SyncedRealmContext} from '../RealmConfig';
const {useRealm} = SyncedRealmContext;
import {Text} from 'react-native';
function CheckNetworkConnection() {
const realm = useRealm();
const [isConnected, setIsConnected] = useState(
realm.syncSession?.isConnected(),
);
useEffect(() => {
const connectionNotificationCallback = (newState, oldState) => {
console.log('Current connection state: ' + newState);
console.log('Previous connection state: ' + oldState);
setIsConnected(realm.syncSession?.isConnected());
};
// Listen for changes to connection state
realm.syncSession?.addConnectionNotification(
connectionNotificationCallback,
);
// Remove the connection listener when component unmounts
return () =>
realm.syncSession?.removeConnectionNotification(
connectionNotificationCallback,
);
// Run useEffect only when component mounts
}, []);
return (
<Text>
{isConnected ? 'Connected to Network' : 'Disconnected from Network'}
</Text>
);
}
import React, {useState, useEffect} from 'react';
import {Context} from '../RealmConfig';
const {useRealm} = Context;
import {Text} from 'react-native';
function CheckNetworkConnection() {
const realm = useRealm();
const [isConnected, setIsConnected] = useState(
realm.syncSession?.isConnected(),
);
useEffect(() => {
const connectionNotificationCallback: Realm.ConnectionNotificationCallback =
(newState, oldState) => {
console.log('Current connection state: ' + newState);
console.log('Previous connection state: ' + oldState);
setIsConnected(realm.syncSession?.isConnected());
};
// Listen for changes to connection state
realm.syncSession?.addConnectionNotification(
connectionNotificationCallback,
);
// Remove the connection listener when component unmounts
return () =>
realm.syncSession?.removeConnectionNotification(
connectionNotificationCallback,
);
// Run useEffect only when component mounts
}, []);
return (
<Text>
{isConnected ? 'Connected to Network' : 'Disconnected from Network'}
</Text>
);
}

세션 멀티플렉싱 활성화 Realm 앱 의 여러 동기화 세션을 통합합니다. 파일 디스크립터 제한에 도달했다는 오류가 표시되고 많은 동기화 세션을 사용하고 있는 경우에만 세션 멀티플렉싱을 사용하세요.

세션 멀티플렉싱을 활성화하려면 Realm.App.Sync.enableSessionMultilexing() Realm.App과 함께 사용하세요.

import React, {useEffect} from 'react';
import {Context} from '../RealmConfig';
import {AppProvider, UserProvider, useUser, useApp, Realm} from '@realm/react';
function AppWrapper() {
return (
<AppProvider id={APP_ID}>
<UserProvider fallback={<LogIn />}>
<RealmWrapper>
<RestOfApp />
</RealmWrapper>
</UserProvider>
</AppProvider>
);
}
type RealmWrapperProps = {
children: React.ReactNode;
};
function RealmWrapper({children}: RealmWrapperProps) {
const app = useApp();
Realm.App.Sync.enableSessionMultiplexing(app);
return <RealmProvider sync={{flexible: true}}>{children}</RealmProvider>;
}

돌아가기

Flexible Sync 구독 관리