ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ - Swift SDK
์ด ํ์ด์ง์ ๋ด์ฉ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ๋ Realm Swift SDK์ ํจ๊ป Atlas Device Sync๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ด์ ๋ชจ๋์ ๋๋ค. ์ ์ฑ์๋ Flexible Sync ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ํ์ด์ง์ ์ ๋ณด๋ ์์ง ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
ํ
Realm Swift SDK v10.40.0 and newer supports the ability to migrate from Partition-Based Sync to Flexible Sync. For more information, refer to: Migrate from Partition-Based Sync to Flexible Sync.
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ๋ฐ Atlas App Services์์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ App Services ๋ฌธ์์์ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ๋ฅผ ์ฐธ์กฐํ์ธ์.
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ Realm ์ด๊ธฐ
๋ฐฑ์๋ ์ฑ ๊ตฌ์ฑ์ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ๊ตฌํ์ ํํฐ์ ๊ฐ์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ๋ฅผ ๊ตฌ์ฑํ ๋ ์ ํํ๋ ํํฐ์ ํค ํ๋์ ๊ฐ์ ๋๋ค.
ํํฐ์ ๊ฐ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ก์ธ์คํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
๋๊ธฐํ๋ ์์ญ์ ์ด ๋ ํํฐ์ ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
๋๊ธฐํ ๊ตฌ์ฑ ์ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๋ Realm์ ์ด๊ธฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ญ๊ณผ ๋๊ธฐํํด์ผ ํ๋ ํํฐ์ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
์ฒ์ ๋ก๊ทธ์ธํ์ฌ ๋๊ธฐํ๋ Realm์ ์ด๋ฉด ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์ธํ๊ณ ์ํ๋ partitionValue ๊ฐ ์๋ ์ฌ์ฉ์์ RLMSyncConfiguration ๊ฐ์ฒด๋ฅผ +[RLMRealm realmWithConfiguration:error:]์ ์ ๋ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฅ์น์์ ๋๊ธฐํ๋ ์์ญ์ด ์ด๋ฆฝ๋๋ค. Realm์ ์๋ฒ์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝํ ๋ด์ฉ์ ์ ๋ก๋ํ๊ธฐ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฑ๊ณผ ๋๊ธฐํ๋ฅผ ์๋ํฉ๋๋ค.
RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; // Log in... RLMUser *user = [app currentUser]; NSString *partitionValue = @"some partition value"; RLMRealmConfiguration *configuration = [user configurationWithPartitionValue:partitionValue]; NSError *error = nil; RLMRealm *realm = [RLMRealm realmWithConfiguration:configuration error:&error]; if (error != nil) { NSLog(@"Failed to open realm: %@", [error localizedDescription]); // handle error } else { NSLog(@"Opened realm: %@", realm); // Use realm }
์ํ๋ ํํฐ์ ๊ฐ ์ด ํฌํจ๋ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ์์ญ ์ด๋์ ๋ผ์ด์ ์ ์ ๋ฌํฉ๋๋ค.
์์ญ์ ์ด๊ธฐ ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์ด๋ก๋ํ ์ง ์ฌ๋ถ๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ๋ค์ด๋ก๋ ๋์์ ์ง์ ํ์ง ์์ผ๋ฉด ์ฅ์น์ ์๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์์ญ์ด ์ด๋ฆฌ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณ๊ฒฝ ์ฌํญ ๋๊ธฐํ๋ฅผ ์๋ํฉ๋๋ค.
let app = App(id: YOUR_APP_SERVICES_APP_ID) // Store a configuration that consists of the current user, // authenticated to this instance of your app. If there is no // user, your code should log one in. let user = app.currentUser let partitionValue = "some partition value" var configuration = user!.configuration(partitionValue: partitionValue) // Open the database with the user's configuration. let syncedRealm = try! Realm(configuration: configuration) print("Successfully opened the synced realm: \(syncedRealm)")
๋๊ธฐํ๋์ง ์์ Realm์ ๋๊ธฐํ๋ Realm์ผ๋ก ์ด๊ธฐ
๋ฒ์ 10.23.0์ ์๋ก์ด ๊ธฐ๋ฅ
๋๊ธฐํ๋์ง ์์ Realm์ด ๋ค๋ฅธ ๊ธฐ๊ธฐ ๋ฐ Atlas App Services ๋ฐฑ์๋์ ๋๊ธฐํ๋ฅผ ์์ํ๋ ค๋ฉด writeCopy(configuration: ) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํ ๊ตฌ์ฑ์ ์ฌ์ฉํ ๋๊ธฐํ๋์ง ์์ Realm์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ ์์์๋ ๋๊ธฐํ ๊ตฌ์ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋๊ธฐํ๋์ง ์์ Realm ํ์ผ์ ๋ณต์ฌ๋ณธ๊ณผ ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
๋๊ธฐํ์ ์ฌ์ฉํ ์์ญ์ ๋ณต์ฌํ ํ์๋ ๋ณต์ฌ๋ณธ์ ๋๊ธฐํ๋ ์์ญ์ผ๋ก ์ด ์ ์์ต๋๋ค. ๋๊ธฐํ๋ Realm์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ Realm ํ์ผ์ ๋ฐ์๋๋ฉฐ ๋ค๋ฅธ ์ฅ์น์ App Services ๋ฐฑ์๋์๋ ์ ํ๋ฉ๋๋ค.
์ฐธ๊ณ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ๋ง ํด๋น
์ด ๋ฐฉ๋ฒ์ ๋น๋๊ธฐํ Realm๊ณผ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ๊ฐ์ ๋ณํ๋ง ์ง์ํฉ๋๋ค. ์ฑ์์ ์ ์ฐํ ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Realm์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๋ฐ๋ณตํ๊ณ ๋ค๋ฅธ Realm์ผ๋ก ๋ณต์ฌํด์ผ ํฉ๋๋ค.
ํ
์ฑ์ด async/await
์ปจํ
์คํธ์์ Realm์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ @MainActor
(์ผ)๋ก ํ์ํ์ฌ ์ค๋ ๋ ๊ด๋ จ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
try await convertLocalRealmToSyncedRealm() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func convertLocalRealmToSyncedRealm() async throws { let app = App(id: YOUR_APP_SERVICES_APP_ID) // Log in the user whose realm you want to open as a synced realm let syncUser = try await app.login(credentials: Credentials.anonymous) // Create a configuration to open the sync user's realm var syncConfig = syncUser.configuration(partitionValue: "Your Partition Value") syncConfig.objectTypes = [QsTask.self] // Prepare the configuration for the user whose local realm you // want to convert to a synced realm var localConfig = Realm.Configuration() localConfig.objectTypes = [QsTask.self] // For this example, add some data to the local realm // before copying it. No need to do this if you're // copying a realm that already contains data. let localRealm = addExampleData(config: localConfig) // Create a copy of the local realm that uses the // sync configuration. All the data that is in the // local realm is available in the synced realm. try! localRealm.writeCopy(configuration: syncConfig) // Open the synced realm we just created from the local realm let syncedRealm = try await Realm(configuration: syncConfig) // Access the Task objects in the synced realm to see // that we have all the data we expect let syncedTasks = syncedRealm.objects(QsTask.self) var frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoSyncedTasks.count, 3) print("Synced realm opens and contains this many tasks: \(frodoSyncedTasks.count)") // Add a new task to the synced realm, and see it in the task count let task4 = QsTask(value: ["name": "Send gift basket to Tom Bombadil", "owner": "Frodo"]) try! syncedRealm.write { syncedRealm.add(task4) } frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoSyncedTasks.count, 4) print("After adding a task, the synced realm contains this many tasks: \(frodoSyncedTasks.count)") // Open the local realm, and confirm that it still only contains 3 tasks let openedLocalRealm = try await Realm(configuration: localConfig) let localTasks = openedLocalRealm.objects(QsTask.self) let frodoLocalTasks = localTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoLocalTasks.count, 3) print("Local realm opens and contains this many tasks: \(frodoLocalTasks.count)") XCTAssertNotEqual(frodoLocalTasks.count, frodoSyncedTasks.count) /// Populate the local realm with some data that we'll use in the synced realm. func addExampleData(config: Realm.Configuration) -> Realm { // Prepare the configuration for the user whose local realm you // want to convert to a synced realm let localConfig = config // Open the local realm, and populate it with some data before returning it let localRealm = try! Realm(configuration: localConfig) let task1 = QsTask(value: ["name": "Keep it secret", "owner": "Frodo"]) let task2 = QsTask(value: ["name": "Keep it safe", "owner": "Frodo"]) let task3 = QsTask(value: ["name": "Journey to Bree", "owner": "Frodo"]) try! localRealm.write { localRealm.add([task1, task2, task3]) } return localRealm } }
๋๊ธฐํ๋ Realm์ ๋๊ธฐํ๋์ง ์์ Realm์ผ๋ก ์ด๊ธฐ
๋ฒ์ 10.23.0์ ์๋ก์ด ๊ธฐ๋ฅ
ํ
๋๊ธฐํ๋ ์์ญ์ ๋๊ธฐํ๋์ง ์์ ์์ญ์ผ๋ก ์๊ตฌ์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ ๋๊ธฐํ ์ธ์ ์ ์ผ์์ ์ผ๋ก ์ผ์ ์ค์งํ ์ ์์ต๋๋ค. ์ฐธ์กฐ: ๋๊ธฐํ ์ธ์ ์ผ์ ์ค๋จ ๋๋ ๋ค์ ์์.
Realm์ด Atlas App Services ๋ฐฑ์๋์ ๋๊ธฐํ๋๋ ๊ฒ์ ์๊ตฌ์ ์ผ๋ก ์ค์งํ๋ ค๋ฉด writeCopy(configuration: ) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๊ตฌ์ฑ์ ์ฌ์ฉํ ๋๊ธฐํ๋ Realm์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ ์์ ์์๋ ์ง์ ํ ํ์ผ URL์ ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํฌํจ๋ Realm ํ์ผ์ ๋ณต์ฌ๋ณธ์ ์์ฑํฉ๋๋ค.
์ด ํ๋ก์ธ์ค๋ ๋ก์ปฌ ์์ญ์์ realm_id
์(๋ฅผ) ์ ๊ฑฐํฉ๋๋ค. ์์ฑ์ ์ญ์ ํ ๊ฒ์ฒ๋ผ ์คํค๋ง ๋ฒ์ ์ ์ฆ๊ฐ์์ผ์ผ ํฉ๋๋ค.
๋๊ธฐํ ์์ด ์ฌ์ฉํ ์์ญ์ ๋ณต์ฌํ ํ์๋ ๋ณต์ฌ๋ณธ์ ๋๊ธฐํ๋์ง ์์ ์์ญ์ผ๋ก ์ด ์ ์์ต๋๋ค. ๋๊ธฐํ๋์ง ์์ Realm์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ก์ปฌ Realm ํ์ผ์๋ง ๋ฐ์๋ฉ๋๋ค. ๋ค๋ฅธ ๊ธฐ๊ธฐ๋ App Services ๋ฐฑ์๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ๋ง ํด๋น
์ด ๋ฐฉ๋ฒ์ ๋น๋๊ธฐํ Realm๊ณผ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ๊ฐ์ ๋ณํ๋ง ์ง์ํฉ๋๋ค. ์ฑ์์ ์ ์ฐํ ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Realm์ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๋ฐ๋ณตํ๊ณ ๋ค๋ฅธ Realm์ผ๋ก ๋ณต์ฌํด์ผ ํฉ๋๋ค.
ํ
์ฑ์ด async/await
์ปจํ
์คํธ์์ Realm์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ @MainActor
(์ผ)๋ก ํ์ํ์ฌ ์ค๋ ๋ ๊ด๋ จ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
try await convertSyncedRealmToLocalRealm() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func convertSyncedRealmToLocalRealm() async throws { let app = App(id: YOUR_APP_SERVICES_APP_ID) // Log in the user whose realm you want to open as a local realm let syncUser = try await app.login(credentials: Credentials.anonymous) // Create a configuration to open the seed user's realm var syncConfig = syncUser.configuration(partitionValue: "Some Partition Value") syncConfig.objectTypes = [QsTask.self] // Open the realm with the Sync user's config, downloading // any remote changes before opening. let syncedRealm = try await Realm(configuration: syncConfig, downloadBeforeOpen: .always) print("Successfully opened realm: \(syncedRealm)") // Verify the data we expect in the realm // The synced realm we are copying contains 3 tasks whose owner is "Frodo" let syncedTasks = syncedRealm.objects(QsTask.self) var frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoSyncedTasks.count, 3) print("Synced realm opens and contains this many tasks: \(frodoSyncedTasks.count)") // Construct an output file path for the local Realm guard let outputDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } // Append a file name to complete the path let localRealmFilePath = outputDir.appendingPathComponent("local.realm") // Construct a local realm configuration var localConfig = Realm.Configuration() localConfig.objectTypes = [QsTask.self] localConfig.fileURL = localRealmFilePath // `realm_id` will be removed in the local realm, so we need to bump // the schema version. localConfig.schemaVersion = 1 // Check to see if there is already a realm at the local realm file path. If there // is already a realm there, delete it. if Realm.fileExists(for: localConfig) { try Realm.deleteFiles(for: localConfig) print("Successfully deleted existing realm at path: \(localRealmFilePath)") } else { print("No file currently exists at path") } // Make a copy of the synced realm that uses a local configuration try syncedRealm.writeCopy(configuration: localConfig) // Try opening the realm as a local realm let localRealm = try await Realm(configuration: localConfig) // Verify that the copied realm contains the data we expect let localTasks = localRealm.objects(QsTask.self) var frodoLocalTasks = localTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoLocalTasks.count, 3) print("Local realm opens and contains this many tasks: \(frodoLocalTasks.count)") let task = QsTask(value: ["name": "Send gift basket to Tom Bombadil", "owner": "Frodo"]) try! localRealm.write { localRealm.add(task) } frodoLocalTasks = localTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoLocalTasks.count, 4) print("After adding a task, the local realm contains this many tasks: \(frodoLocalTasks.count)") frodoSyncedTasks = syncedTasks.where { $0.owner == "Frodo" } XCTAssertEqual(frodoSyncedTasks.count, 3) print("After writing to local realm, synced realm contains this many tasks: \(frodoSyncedTasks.count)") XCTAssertNotEqual(frodoLocalTasks.count, frodoSyncedTasks.count) }
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ์์ Flexible Sync๋ก ๋ง์ด๊ทธ๋ ์ด์
App Services Realm Mobile Sync ๋ชจ๋๋ฅผ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ์์ Flexible Sync๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ์๋ ํ๋ก์ธ์ค์ ๋๋ค. ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฌ์ฉํ๋ ค๋ฉด Realm Swift SDK ๋ฒ์ 10.40.0 ์ด์์ด ํ์ํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ๊ธฐ์กด App Services ์ฌ์ฉ์ ๋ฐ ์ธ์ฆ ๊ตฌ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. Flexible Sync๋ ๋์ฑ ๋ค์ํ ๊ถํ ๊ตฌ์ฑ ์ต์ ๊ณผ ๋ณด๋ค ์ธ๋ถํ๋ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
App Services App์ ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ์์ Flexible Sync๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Device Sync ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐธ์กฐํ์ธ์.
๋ง์ด๊ทธ๋ ์ด์ ํ ํด๋ผ์ด์ธํธ ์ฝ๋ ์ ๋ฐ์ดํธ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ์์ Flexible Sync๋ก ์๋ ๋ง์ด๊ทธ๋ ์ด์ ํ ๋๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด Realm์ ๋ค์์ ํตํด ๋ ๋๊ธฐํ ๋ชจ๋์ ์ฐจ์ด์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
partitionKey == partitionValue
์ธ ๊ฐ Realm ๊ฐ์ฒด ์ ํ์ ๋ํด Flexible Sync ๊ตฌ๋ ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.ํ๋๊ฐ ์์ง ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์ฒด์
partitionKey
ํ๋๋ฅผ ์ฝ์ ํฉ๋๋ค. ์ด๋ ์๋ Flexible Sync ๊ตฌ๋ ์ ํ์ํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ํ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์จ๊ฒจ์ง ๋ง์ด๊ทธ๋ ์ด์ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์ฝ๋๋ฒ ์ด์ค์์ ์ ๋ชจ๋ธ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
Realm ๊ฐ์ฒด๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
๋๊ธฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ค ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ ค๋ ๊ฒฝ์ฐ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ Flexible Sync๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ธ์.
๋๊ธฐํ๋ Realm์ ์ฌ๋
flexibleSyncConfiguration()
๋ก ์ ํํฉ๋๋ค.Flexible Sync ๊ตฌ๋ ์ ์ฌ์ฉํ ๊ด๋ จ ์์ฑ์ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด
ownerId
์์ฑ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฐ์ดํฐ๋ง ๋๊ธฐํํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.์๋ Flexible Sync ๊ตฌ๋ ์ ์ ๊ฑฐํ๊ณ ๊ด๋ จ ๊ตฌ๋ ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
์ด๋ฌํ ์ ๋ต์ ๋ํ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ๋ฐฉ๋ฒ์ ์๋ฅผ ํฌํจํ์ฌ Flexible Sync ๊ถํ ์ ๋ต์ ์๋ Device Sync ๊ถํ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ตฌ๋ ์ ๊ฑฐ ๋ฐ ์๋ ์์ฑ
ํํฐ์ ๊ธฐ๋ฐ ๋๊ธฐํ์์ Flexible Sync๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด Realm์ ์ฑ์ ๋ํ ์จ๊ฒจ์ง Flexible Sync ๊ตฌ๋ ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ๋ค์์ ๊ตฌ๋ ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ๋ค์์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฅผ ํตํด ํฅํ ๋ฐ๋ณต ๋ฐ ๋๋ฒ๊น ์ ์ํด ์ฝ๋๋ฒ ์ด์ค์์ ๋ชจ๋ ๊ตฌ๋ ๋ก์ง์ ํจ๊ป ๋ณผ ์ ์์ต๋๋ค.
์๋์ผ๋ก ์์ฑ๋ Flexible Sync ๊ตฌ๋ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํด๋ผ์ด์ธํธ ์ฑ์ Flexible Sync๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐธ์กฐํ์ธ์.