Docs Menu

managed 동기화 세션 - Kotlin SDK

이 페이지에서는 동기화 세션과 Flexible Sync를 사용하여 앱에서 관리 하는 방법에 대해 설명합니다. Flexible Sync에 대한 자세한 내용은 App Services 문서에서 Atlas Device Sync 를 참조하세요.

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

val app = App.create(YOUR_APP_ID)
val user = app.login(credentials)
val config = SyncConfiguration.Builder(user, setOf(Task::class))
.build()
// Open the synced realm
val realm = Realm.open(config)
// Sync session is now active
// ... do something with the synced realm

동기화 세션은 다음을 managed.

  • 영역에 변경 사항 업로드 및 다운로드

  • 동기화 일시 중지 및 다시 시작

  • 네트워크 연결 모니터링

realm.syncSession 속성을 통해 동기화된 단일 Realm의 SyncSession 에 액세스할 수 있습니다.

Kotlin SDK는 두 가지 수준에서 App Services와의 통신을 managed합니다.

  • connection state: 클라이언트 기기와 백엔드 앱 간의 네트워크 연결 상태입니다.

  • 세션 상태: 단일 사용자의 동기화 상태로, SDK에서 마음대로 일시 중지했다가 다시 시작할 수 있습니다( 동기화 세션 일시 중지 및 다시 시작 섹션 참조).

두 상태 모두 사용자의 로컬 변경 사항을 백엔드에 동기화할지 여부를 결정합니다. 동기화는 SyncSession.ConnectionStateCONNECTED 이고 SyncSession.StateACTIVE 또는 DYING 인 경우에만 발생합니다.

동기화된 영역에서 모든 변경 사항이 Atlas로 업로드될 때까지 비동기적으로 기다리려면 uploadAllLocalChanges 를 호출합니다. 이 메서드는 모든 변경 사항이 업로드되면 true 를 반환합니다.

Atlas의 모든 변경 사항이 Device Sync 서버에서 동기화된 Realm으로 다운로드될 때까지 비동기적으로 기다리려면 downloadAllServerChanges 를 호출합니다. 이 메서드는 모든 변경 사항이 다운로드되면 true 를 반환합니다.

두 메서드 중 하나에 선택 사항인 timeout 매개변수를 포함하여 false 을 반환하기까지의 최대 시간을 결정할 수도 있습니다. false 을(를) 반환한 후에도 업로드 또는 다운로드는 백그라운드에서 계속됩니다.

다음 예제에서는 제한 시간이 정의된 상태에서 두 메서드를 모두 호출하는 방법을 보여 줍니다.

// Wait to download all pending changes from Atlas
realm.syncSession.downloadAllServerChanges(1.minutes)
// Add data locally
realm.write {
this.copyToRealm(Task().apply {
taskName = "Review proposal"
assignee = "Emma"
progressMinutes = 0
})
}
// Wait for local changes to be uploaded to Atlas
realm.syncSession.uploadAllLocalChanges(1.minutes)

세션에 대한 동기화를 일시 중지하려면 syncSession.pause() 를 호출합니다. 세션이 일시 중지되는 동안 Realm은 Atlas와 변경 사항을 동기화하지 않습니다.

변경 사항 동기화를 다시 시작하려면 syncSession.resume()을 호출합니다.

동기화 세션을 일시 중지했다가 다시 시작하려는 각 영역에 대해 syncSession.pause()syncSession.resume() 를 수동으로 호출해야 합니다. 한 세션의 동기화 상태는 열려 있는 다른 세션에 영향을 주지 않습니다.

다음 코드 블록에서는 이러한 메서드를 호출하는 방법을 보여 줍니다.

// Pause the sync session
// Data that you write while session is paused does not sync to Atlas
realm.syncSession.pause()
// Add data locally
realm.write {
this.copyToRealm(Task().apply {
taskName = "Submit expense report"
assignee = "Kevin"
progressMinutes = 0
})
}
// Resume sync session
// Local changes now sync to Atlas
realm.syncSession.resume()

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

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

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

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

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

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

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

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

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

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

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

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

SyncSession.connectionState 를 확인하여 현재 네트워크 연결 상태를 가져올 수 있습니다. 속성. 네트워크 연결 상태를 나타내는 ConnectionState 열거형 값을 반환합니다. 가능한 상태는 CONNECTED, DISCONNECTED 또는 CONNECTING 입니다.

if (realm.syncSession.connectionState == ConnectionState.CONNECTED) {
Log.i("Connected to network")
// ... do something
}

connectionStateAsFlow를 사용하여 네트워크 연결 상태를 모니터링합니다. 이 속성은 네트워크 연결이 변경될 때 업데이트되는 ConnectionStateChange 객체의 흐름을 반환합니다. ConnectionStateChange 에서 신규 및 기존 ConnectionState 에 액세스할 수 있습니다.

val connectionFlow = realm.syncSession.connectionStateAsFlow()
connectionFlow.collect { ConnectionStateChange ->
if (ConnectionStateChange.newState == ConnectionState.CONNECTED) {
Log.i("Connected to Atlas Device Sync server")
}
}

버전 1.11.0의 새로운 기능.

Realm은 장치가 오프라인 상태였다가 다시 연결되면 자동으로 감지하고 증분 백오프 전략을 사용하여 다시 연결을 시도합니다.

Kotlin SDK 1.11.0 버전 이상에서는 trigger App.Sync.reconnect() 메서드 를 사용하여 재연결 시도를 수동으로 하도록 선택할 수 있습니다. 증분 백오프 기간을 기다리는 대신 이는 네트워크 상태를 더 정확하게 이해하고 있고(예: Android에서 ConnectivityManager 로 네트워크 변경 사항을 모니터링하는 경우) Realm의 자동 재연결 감지에 의존하고 싶지 않은 경우에 유용합니다. SDK는 기기가 비행기 모드를 해제할 때에도 이 메서드를 자동으로 호출합니다.

재연결 시도를 수동으로 trigger 하려면 App.Sync.reconnect() 메서드로, App.Sync 인터페이스를 통해 액세스합니다. 단일 Realm 동기화 세션에 액세스할 수 있는 SyncSession 과 달리 App.Sync 인터페이스는 앱의 모든 동기화 세션을 제어합니다.

app.sync.reconnect()

이 메서드를 호출하면 SDK는 모든 동기화 세션이 즉시 재연결을 시도하도록 강제하고 증분 백오프에 사용되는 모든 타이머를 재설정합니다.

중요

소켓 읽기 제한 시간 내에 다시 연결할 수 없음

Realm의 내부 기본 소켓 읽기 제한 시간은 2분이며, 읽기 작업이 2분 창 내에 데이터를 수신하지 않으면 Realm이 시간 초과됩니다. 해당 창에서 App.Sync.reconnect() 를 호출하면 코틀린 SDK(Kotlin SDK)는 다시 연결을 시도하지 않습니다 .