동기화 오류 처리 - C++ SDK
이 페이지의 내용
동기화 오류 처리
Realm Mobile Sync를 사용하는 애플리케이션을 개발하는 동안 오류 핸들러를 설정해야 합니다. 이 오류 핸들러는 실패한 동기화 관련 API 호출을 감지하고 이에 응답할 수 있습니다.
sync_config 에서 오류 핸들러를 설정합니다. 오류가 발생하면 C++ SDK 는 sync_error 객체 및 오류가 발생한 sync_session 을 사용하여 오류 핸들러를 호출합니다.
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::anonymous()).get(); auto dbConfig = user.flexible_sync_configuration(); // Setting an error handler on the sync_config gives you access to // sync_session and sync_error dbConfig.sync_config().set_error_handler( [](const realm::sync_session &session, const realm::internal::bridge::sync_error &error) { std::cerr << "A sync error occurred. Message: " << error.message() << std::endl; }); auto syncRealm = realm::db(dbConfig);
팁
일반적인 Device Sync 오류 목록과 이를 처리하는 Device Sync 방법은 Atlas App Services 문서에서 동기화 오류 를 참조하세요.
클라이언트 재설정
Device Sync 를 사용할 때 클라이언트 재설정 은 서버 가 더 이상 기기 데이터베이스 와 동기화 할 수 없을 때 클라이언트 앱 에서 수행해야 하는 오류 복구 작업 입니다. 이 경우 동기화 기능 을 복원 하려면 기기에서 데이터베이스 를 서버 와 일치하는 상태 로 재설정해야 합니다.
이 경우 장치의 동기화할 수 없는 데이터베이스에 아직 서버와 동기화되지 않은 데이터가 포함될 수 있습니다. SDK는 클라이언트 재설정 프로세스 중에 해당 데이터 복구 또는 삭제를 시도할 수 있습니다.
클라이언트 재설정이 발생하는 원인에 대한 자세한 내용은 Go App Services 문서의 클라이언트 재설정을 참조하세요.
자동 및 수동 클라이언트 재설정
SDK는 대부분의 클라이언트 재설정 오류를 자동으로 처리하다 하는 클라이언트 재설정 모드 를 제공합니다. 자동 클라이언트 재설정 모드는 데이터베이스 를 닫거나 알림 을 누락하지 않고 기기의 데이터베이스 파일 을 동기화 가능한 상태 로 복원 합니다.
manual()
를 제외한 모든 클라이언트 재설정 모드는 자동 클라이언트 재설정을 수행합니다. 모드 간의 차이점은 아직 백엔드에 동기화되지 않은 기기의 변경 사항을 처리하는 방법에 따라 달라집니다.
대부분의 클라이언트 재설정 시나리오를 자동으로 처리하려면 recover_unsynced_changes()
를 선택합니다. 이렇게 하면 클라이언트 재설정이 발생할 때 동기화되지 않은 변경 사항을 복구하려고 시도합니다.
경우에 따라 수동 클라이언트 재설정 처리기를 설정 해야 하거나 설정해야 할 수 있습니다. 앱에 자동으로 처리할 수 없는 특정 클라이언트 재설정 로직이 필요한 경우 이 작업을 수행할 수 있습니다.
클라이언트 재설정 모드 지정
C++ SDK는 데이터베이스 구성 에서 클라이언트 재설정 핸들러를 지정할 수 있는 옵션을 제공합니다. 이 클라이언트 재설정 처리기는 client_reset_mode_base 를 사용할 수 있습니다. 이 구조체를 사용하면 다음을 지정할 수 있습니다.
클라이언트 재설정 전에 실행할 차단입니다.
클라이언트 재설정 후 실행할 차단
클라이언트 재설정을 처리할 때 사용할 모드
auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); // Set the client reset handler with your preferred client reset mode. syncConfig.set_client_reset_handler( realm::client_reset::recover_unsynced_changes(beforeReset, afterReset)); auto syncedRealm = realm::db(syncConfig);
사용 가능한 클라이언트 재설정 모드 중 하나를 사용하여 클라이언트 재설정 중에 SDK가 기기에서 동기화되지 않은 데이터를 확인하려고 시도하는 방법을 지정할 수 있습니다.
recover_unsynced_changes()
recover_or_discard_unsynced_changes()
discard_unsynced_changes()
manual()
자동 클라이언트 재설정 프로세스 중에 실행할 전후 차단을 지정할 수 있습니다. 이를 사용하여 애플리케이션에 중요한 복구 로직을 수행할 수 있습니다.
/* You can define blocks to call before and after the client reset occur if you need to execute specific logic, such as reporting or debugging. */ auto beforeReset = [&](realm::db before) { /* A block called after a client reset error is detected, but before the client recovery process is executed. You could use this block for any custom logic, reporting, debugging etc. You have access to the database before the client reset occurs in this block. */ }; auto afterReset = [&](realm::db device, realm::db server) { /* A block called after the client recovery process has executed. This block could be used for custom recovery, reporting, debugging etc. You have access to the database that is currently on the device - the one that can no longer sync - and the new database that has been restored from the server. */ };
앱에 특정 클라이언트 복구가 필요한 경우 manual()
클라이언트 재설정 모드를 지정하고 수동 클라이언트 재설정 핸들러 를 설정할 수 있습니다. 클라이언트 재설정 중에 앱이 수행해야 하는 특정 사용자 지정 로직이 있거나 클라이언트 복구 규칙 이 앱에서 작동하지 않는 경우 이 작업을 수행할 수 있습니다.
스키마 변경 처리
클라이언트 복구 는 Device Sync를 구성 할 때 기본적으로 활성화되는 기능입니다. 클라이언트 복구가 활성화되면 SDK는 대부분의 경우 클라이언트 재설정 프로세스를 자동으로 관리할 수 있습니다. 스키마를 변경하는 경우:
클라이언트는 스키마 변경이 없거나 손상적이지 않은 스키마 변경이 없는 경우 동기화되지 않은 변경 사항을 복구 할 수 있습니다.
손상적인 스키마 변경이 발생하면 자동 클라이언트 재설정 모드는 수동 오류 처리기로 되돌아갑니다. 이 경우 수동 클라이언트 재설정 오류 처리기 를 설정할 수 있습니다. 앱에서 호환성이 손상되는 스키마 변경이 있을 때는 자동 클라이언트 복구를 수행할 수 없습니다.
단절적 스키마 변경과 단절적이지 않은 변경에 대한 자세한 내용은 단절적 변경과 단절적이지 않은 변경 비교를 참조하세요.
동기화되지 않은 변경 내용 복구
클라이언트 재설정 중에 클라이언트 애플리케이션은 아직 백엔드에 동기화되지 않은 기기의 동기화된 데이터베이스에서 데이터 복구를 시도할 수 있습니다. 동기화되지 않은 변경 사항을 복구하려면 기본적으로 활성화되어 있는 App Services App 에서클라이언트 복구 를 활성화해야 합니다.
앱이 아직 동기화되지 않은 변경 사항을 복구하도록 하려면 다음 클라이언트 복구 모드 중 하나를 사용하세요.
recover_unsynced_changes()
: 클라이언트가 동기화되지 않은 변경 사항을 복구하려고 시도합니다. 동기화되지 않은 변경 사항을 삭제하고 싶지 않을 때 이 모드를 선택하세요.recover_or_discard_unsynced_changes()
: 클라이언트는 먼저 아직 동기화되지 않은 변경 사항을 복구하려고 시도합니다. 클라이언트가 동기화되지 않은 데이터를 복구할 수 없는 경우 동기화 되지 않은 변경 사항을 삭제 하지만 계속 자동으로 클라이언트 재설정을 수행합니다. 동기화되지 않은 변경 사항을 삭제하도록 자동 클라이언트 복구를 활성화하려면 이 모드를 선택합니다.
auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); // Set the client reset handler with your preferred client reset mode. syncConfig.set_client_reset_handler( realm::client_reset::recover_unsynced_changes(beforeReset, afterReset)); auto syncedRealm = realm::db(syncConfig);
손상적인 스키마 변경이 있거나 Device Sync 구성에서 클라이언트 복구 가 비활성화된 경우와 같이 recover_unsynced_changes()
모드 에서 클라이언트 재설정 작업을 완료할 수 없는 경우가 있을 수 있습니다. 이 경우를 처리하다 하기 위해 앱 은 동기화 오류 핸들러에서 클라이언트 재설정 오류를 처리하다 할 수 있습니다. 자세한 내용은 이 페이지의 수동 클라이언트 재설정 모드 섹션을 참조하세요.
클라이언트 복구 규칙
클라이언트 복구가 활성화된 경우 이러한 규칙은 백엔드와 클라이언트가 모두 동일한 객체를 변경할 때 충돌을 해결하는 방법을 포함하여 객체가 통합되는 방식을 결정합니다.
로컬에서 생성되었지만 클라이언트 재설정 전에 동기화되지 않은 객체는 동기화됩니다.
객체가 서버에서 삭제되었지만 복구 클라이언트에서 수정된 경우 삭제가 우선적으로 적용되고 클라이언트는 업데이트를 삭제합니다.
객체가 복구 중인 클라이언트에서는 삭제되고 서버에서는 삭제되지 않는 경우 클라이언트는 서버의 삭제 명령을 적용합니다.
동일한 필드에 대한 업데이트가 충돌하는 경우 클라이언트 업데이트가 적용됩니다.
동기화되지 않은 변경 내용 삭제
discard_unsynced_changes()
클라이언트 재설정 모드는 마지막 동기화에 성공한 이후 기기에서 동기화되지 않은 모든 변경 사항을 영구적으로 삭제합니다. 앱에 Device Sync 클라이언트 복구 규칙 과 일치하지 않는 클라이언트 복구 로직이 필요한 경우 또는 동기화되지 않은 데이터를 복구하지 않으려는 경우 이 모드를 사용할 수 있습니다.
애플리케이션에서 아직 백엔드에 동기화되지 않은 기기 데이터를 잃을 수 없는 경우 동기화되지 않은 변경 사항 삭제 모드를 사용하지 마세요.
동기화되지 않은 변경 사항을 삭제하는 자동 클라이언트 재설정을 수행하려면 discard_unsynced_changes()
클라이언트 재설정 모드를 사용하세요.
auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); // Set the client reset handler with your preferred client reset mode. syncConfig.set_client_reset_handler( realm::client_reset::discard_unsynced_changes(beforeReset, afterReset)); auto syncedRealm = realm::db(syncConfig);
참고
복구 후 삭제
동기화되지 않은 변경 사항을 복구하려고 시도하지만 복구할 수 없는 변경 사항을 삭제하려면 이 페이지의 동기화되지 않은 변경 사항 복구 섹션에 있는 recover_or_discard_unsynced_changes()
문서를 참조하세요.
손상적인 스키마 변경이 있는 경우와 같이 discard_unsynced_changes()
모드에서 클라이언트 재설정 작업을 완료할 수 없는 경우가 있을 수 있습니다. 이 경우를 처리하기 위해 앱은 동기화 오류 핸들러에서 클라이언트 재설정 오류를 처리할 수 있습니다. 자세한 내용은 이 페이지의 수동 클라이언트 재설정 모드 섹션을 참조하세요.
수동 클라이언트 재설정 모드
manual()
클라이언트 재설정 모드를 사용하는 경우 동기화 오류 핸들러에서 사용자 지정 클라이언트 재설정 핸들러를 구현해야 합니다. 가능하면 자동 클라이언트 복구 모드 를 사용하고, 자동 복구 로직이 앱에 적합하지 않은 경우에만 manual()
모드를 선택하는 것이 좋습니다.
auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); // Set the client reset handler to manual client reset mode. syncConfig.set_client_reset_handler(realm::client_reset::manual()); // Define a Sync error handler for handling the client reset. syncConfig.sync_config().set_error_handler( [&](realm::sync_session session, realm::sync_error error) { if (error.is_client_reset_requested()) { /* You might use this for reporting or to instruct the user to delete and re-install the app. */ }; }); auto syncedRealm = realm::db(syncConfig);
손상적인 스키마 변경이 있는 경우와 같이 클라이언트 재설정 작업을 자동으로 완료할 수 없는 경우 클라이언트 재설정 프로세스는 수동 오류 처리기로 넘어갑니다. 이는 다음과 같은 자동 클라이언트 재설정 모드에서 발생할 수 있습니다.
recover_unsynced_changes()
recover_or_discard_unsynced_changes()
discard_unsynced_changes()
사용자에게 앱을 업데이트하거나 다른 조치를 수행하도록 권장하는 치명적인 오류 복구 상황에서는 수동 핸들러를 도구로 취급하는 것이 좋습니다.
클라이언트 재설정 처리 테스트
Device Sync를 종료했다가 다시 활성화하여 애플리케이션의 클라이언트 재설정 처리를 수동으로 테스트할 수 있습니다.
동기화를 종료했다가 다시 허용하면 이전에 동기화로 연결한 클라이언트는 클라이언트 재설정을 수행할 때까지 연결할 수 없습니다. 동기화를 종료하면 클라이언트의 동기화를 허용하는 메타데이터가 서버에서 삭제됩니다. 클라이언트는 서버에서 영역의 새 복사본을 다운로드해야 합니다. 서버는 이러한 클라이언트에 클라이언트 재설정 오류를 보냅니다. 따라서 동기화를 종료하면 trigger 클라이언트 재설정 조건이 됩니다.
클라이언트 재설정 처리를 테스트하려면 다음을 수행합니다.
클라이언트 애플리케이션에서 데이터를 쓰고 동기화될 때까지 기다립니다.
Realm Mobile Sync를 종료했다가 다시 활성화합니다.
클라이언트 앱을 다시 실행합니다. 앱이 서버에 연결하려고 할 때 클라이언트 재설정 오류가 발생해야 합니다.
경고
클라이언트 애플리케이션에서 클라이언트 재설정 처리를 반복하는 동안 동기화를 종료했다가 다시 활성화해야 할 수 있습니다. 동기화를 종료했다가 다시 활성화하면 클라이언트 재설정을 완료할 때까지 기존의 모든 클라이언트를 동기화할 수 없습니다. 프로덕션 환경에서 이를 방지하려면 개발 환경에서 클라이언트 재설정 처리를 테스트하세요.