Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ - Node.js SDK

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ๊ฐ์ฒด ์ „๋žต๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ 
  • ์˜ˆ์‹œ
  • ์Šคํ‚ค๋งˆ์— ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„ ํฌํ•จ
  • ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋„๋ก Realm ๊ตฌ์„ฑ
  • ๋ณ„๋„์˜ Realm์—์„œ ๋™๊ธฐํ™” ์ถ”์ 
  • ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ๋งŒ๋“ค๊ธฐ
  • ๋Œ€์ฒด ์ „๋žต

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ˆ˜๋™ ๋ณต๊ตฌ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ›„ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ์˜์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ๋ณต๊ตฌ์—๋Š” ์ƒ๋‹นํ•œ ์–‘์˜ ์ฝ”๋“œ, ์Šคํ‚ค๋งˆ ์–‘๋ณด ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • ์ถฉ๋Œ ํ•ด๊ฒฐ ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์„ ์ˆ˜ ์—†๊ณ  ๋‹ค๋ฅธ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ realm ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋™ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ Realm ์žฌ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ˆ˜๋™ ๋ณต๊ตฌ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณผ ์Šคํ‚ค๋งˆ ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋™ ๋ณต๊ตฌ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ „๋žต๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์  ์„น์…˜ ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ค‘์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๋ฐฉ์ง€

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ํ›„ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์„ธ์š”. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ์ „ํ˜€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ค‘์š”

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์—๋Š” ์•ฑ ์Šคํ‚ค๋งˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์— ๋”ฐ๋ฅธ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ Realm ํŒŒ์ผ์— ๊ธฐ๋ก๋˜์—ˆ์ง€๋งŒ ์•„์ง ๋ฐฑ์—”๋“œ์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ „๋žต์—์„œ๋Š” ๊ฐ Realm ๊ฐ์ฒด ๋ชจ๋ธ์— "๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„"์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์˜์—ญ์ด ์–ธ์ œ ์ƒํƒœ๋ฅผ ๋ฐฑ์—”๋“œ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋กœ๋“œํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ด€์ฐฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฑ์—”๋“œ์™€์˜ ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์ดํ›„ ์‚ญ์ œ, ์ƒ์„ฑ ๋˜๋Š” ์—…๋ฐ์ดํŠธ๋œ ๊ฐ์ฒด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐฑ์—… ์˜์—ญ์—์„œ ์ƒˆ ์˜์—ญ์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋†’์€ ์ˆ˜์ค€์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฑ์—”๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ „๋žต ๊ตฌํ˜„: SDK๊ฐ€ ์ „๋žต ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  3. ์˜์—ญ์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค ๋‹ซ๊ธฐ : ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์ด ๋ฐœ์ƒํ•˜๋Š” ์˜์—ญ์˜ ์—ด๋ ค ์žˆ๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์ธํ•ด ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ(์˜ˆ: ์•ฑ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์˜ ๋ฆฌ์Šค๋„ˆ์—์„œ ๋™์‹œ์— ๋งŽ์€ Realm ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋˜๋Š” ๋Œ€ํ™” ์ƒ์ž์—์„œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ง์ ‘ ์š”์ฒญ์„ ํ†ตํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. Realm ์„ ๋ฐฑ์—… ํŒŒ์ผ๋กœ ์ด๋™: Realm.App.Sync.initiateClientReset() ์ •์  ๋ฉ”์„œ๋“œ. ์ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ ์˜์—ญ ํŒŒ์ผ์˜ ํ˜„์žฌ ๋ณต์‚ฌ๋ณธ์„ ๋ฐฑ์—… ํŒŒ์ผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  5. ์˜์—ญ ์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค ์—ด๊ธฐ : ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐํ™” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์—ญ์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ์—… ํŒŒ์ผ ์ด๋ฆ„์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์ด ๋ฐœ์ƒํ•œ ์˜์—ญ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๋ฐฑ์—”๋“œ์—์„œ ๋ชจ๋“  Realm ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ : ๊ณ„์†ํ•˜๊ธฐ ์ „์— Realm์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด SyncConfiguration ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

  7. ์˜์—ญ ๋ฐฑ์—… ์—ด๊ธฐ: SyncConfiguration.error ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ error.config ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  8. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜: ๋ณต๊ตฌํ•  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฐฑ์—… ์˜์—ญ์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ ์ƒˆ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์‚ญ์ œ ๋˜๋Š” ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ๊ฐ์ฒด๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์  ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ์ „๋žต์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ด ์˜ˆ์ œ์˜ ์ œํ•œ ์‚ฌํ•ญ

  • ์ด ์˜ˆ์ œ๋Š” ๋‹จ์ผ Realm ๊ฐ์ฒด ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๋‹จ์ผ Realm์ด ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ถ”๊ฐ€ ๊ฐ์ฒด ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ Realm์—์„œ ๋™๊ธฐํ™” ์ถ”์  ์„น์…˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋‹ค๋ฅธ ๋™๊ธฐํ™” ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ ๊ฐ์ฒด ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐฑ์—… ์˜์—ญ์˜ ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™”์— ์„ฑ๊ณตํ•œ ํ›„ ํ•„๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ๊ฒฝ์šฐ ๋ณต๊ตฌ ์ž‘์—…์€ ์ƒˆ ์˜์—ญ์˜ ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธํ•œ ํ•„๋“œ๋ฅผ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด์ „ ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Realm ๊ฐ์ฒด์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋Œ€์‹  ๊ฐ ํ•„๋“œ ์˜ ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„์„ ์ถ”์ ํ•˜๊ณ  ๊ฐ ํ•„๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋Œ€์ฒด ์ „๋žต ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

1

Realm ๊ฐ์ฒด ์Šคํ‚ค๋งˆ์— ์ƒˆ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋กœ Realm ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„๊ณผ ํ•จ๊ป˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•˜์„ธ์š”.

์ผ๋ฐ˜์ ์œผ๋กœ Realm ๊ฐ์ฒด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ์ ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐฑ์—”๋“œ์— ๋™๊ธฐํ™”๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Realm ๊ฐ์ฒด ๋ชจ๋ธ์— ํƒ€์ž„์Šคํƒฌํ”„ lastUpdated ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ ์‹œ์ ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const DogSchema = {
name: "Dog",
properties: {
name: "string",
age: "int?",
lastUpdated: "int",
},
};
2

Realm์˜ SyncConfiguration ์—์„œ clientReset ํ•„๋“œ ๋ฅผ ์ˆ˜๋™ ๋ชจ๋“œ ๋กœ ์„ค์ •ํ•˜๋‹ค ํ•˜๊ณ  error ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฝœ๋ฐฑ ์ƒ์„ฑ ์„น์…˜์—์„œ ์˜ค๋ฅ˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

const config = {
schema: [DogSchema],
sync: {
user: app.currentUser,
partitionValue: "MyPartitionValue",
clientReset: {
mode: "manual",
},
error: handleSyncError, // callback function defined later
},
};
3

๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ ์‹œ์ ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ค‘์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜์—ญ์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ์‹œ์ ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌํ˜„ ์˜ˆ์‹œ์—์„œ๋Š” ๋ณ€๊ฒฝ ๋ฆฌ์Šค๋„ˆ์™€ ์Œ์„ ์ด๋ฃจ๋Š” LastSynced ๋ผ๋Š” ๋ณ„๋„์˜ ์˜์—ญ์— ์žˆ๋Š” ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์—ญ์˜ ๋™๊ธฐํ™”๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

LastSynced Realm์„ ์ •์˜ํ•˜์—ฌ ์˜์—ญ์ด ๋™๊ธฐํ™”๋˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

const LastSyncedSchema = {
name: "LastSynced",
properties: {
realmTracked: "string",
timestamp: "int?",
},
primaryKey: "realmTracked",
};
const lastSyncedConfig = { schema: [LastSyncedSchema] };
const lastSyncedRealm = await Realm.open(lastSyncedConfig);
lastSyncedRealm.write(() => {
lastSyncedRealm.create("LastSynced", {
realmTracked: "Dog",
});
});

๋ณ€๊ฒฝ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ Dog collection์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์„ธ์…˜์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์„œ๋ฒ„์™€ ๋™๊ธฐํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ LastSynced ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

// Listens for changes to the Dogs collection
realm.objects("Dog").addListener(async () => {
// only update LastSynced if sync session is connected
// and all local changes are synced
if (realm.syncSession.isConnected()) {
await realm.syncSession.uploadAllLocalChanges();
lastSyncedRealm.write(() => {
lastSyncedRealm.create("LastSynced", {
realmTracked: "Dog",
timestamp: Date.now(),
});
});
}
});
4

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ–ˆ์œผ๋ฏ€๋กœ ์ˆ˜๋™ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ณต๊ตฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฑ์—… ์˜์—ญ์—์„œ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ์‚ฝ์ž… ๋ฐ ์—…๋ฐ์ดํŠธ ๋ณต์›

  • ๋ฐฑ์—… ์˜์—ญ์—์„œ ์ด์ „์— ์‚ญ์ œ๋œ ๊ฐ์ฒด๋ฅผ ์ƒˆ ์˜์—ญ์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์˜ ๊ตฌํ˜„์„ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function handleSyncError(_session, error) {
if (error.name === "ClientReset") {
const realmPath = realm.path; // realm.path will not be accessible after realm.close()
realm.close(); // you must close all realms before proceeding
// pass your realm app instance and realm path to initiateClientReset()
Realm.App.Sync.initiateClientReset(app, realmPath);
// Redownload the realm
realm = await Realm.open(config);
const oldRealm = await Realm.open(error.config);
const lastSyncedTime = lastSyncedRealm.objectForPrimaryKey(
"LastSynced",
"Dog"
).timestamp;
const unsyncedDogs = oldRealm
.objects("Dog")
.filtered(`lastUpdated > ${lastSyncedTime}`);
// add unsynced dogs to synced realm
realm.write(() => {
unsyncedDogs.forEach((dog) => {
realm.create("Dog", dog, "modified");
});
});
// delete dogs from synced realm that were deleted locally
const syncedDogs = realm
.objects("Dog")
.filtered(`lastUpdated <= ${lastSyncedTime}`);
realm.write(() => {
syncedDogs.forEach((dog) => {
if (!oldRealm.objectForPrimaryKey("Dog", dog._id)) {
realm.delete(dog);
}
});
});
// make sure everything syncs and close old realm
await realm.syncSession.uploadAllLocalChanges();
oldRealm.close();
} else {
console.log(`Received error ${error.message}`);
}
}

๊ฐ€๋Šฅํ•œ ๋Œ€์ฒด ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฐฑ์—… ์ƒํƒœ๋กœ ์ „์ฒด ๋ฐฑ์—”๋“œ ๋ฎ์–ด์“ฐ๊ธฐ: "๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„" ๋˜๋Š” "๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์‹œ๊ฐ„" ์—†์ด ๋ฐฑ์—… ์˜์—ญ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒˆ ์˜์—ญ์œผ๋กœ ์—…์„œํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ๋Š” ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ์‚ญ์ œ๋ฅผ ๋ณต๊ตฌํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์ดํ›„ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐฑ์—”๋“œ์— ๊ธฐ๋ก๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ๊ฐ ์˜์—ญ์— ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž๋งŒ ์“ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ํ•„๋“œ๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ : ๋ชจ๋“  ๊ฐ์ฒด ์˜ '๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„'์„ ์ถ”์ ํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ํ•„๋“œ ์˜ '๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„'์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์˜ ํ•„๋“œ ์“ฐ๊ธฐ๋ฅผ ์ด์ „ ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์œผ๋ ค๋ฉด ์ด ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์ˆ˜์ค€์—์„œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด๋‹น ํ•„๋“œ๊ฐ€ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด์™€ ๋ณ„๋„๋กœ ์—…๋ฐ์ดํŠธ ์ถ”์  : ๊ฐ ๊ฐ์ฒด์˜ ์Šคํ‚ค๋งˆ์—์„œ '๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„'์„ ์ถ”์ ํ•˜๋Š” ๋Œ€์‹  ์Šคํ‚ค๋งˆ์— Updates ๋ผ๋Š” ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Updates ์ œ์™ธ) ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ๋ณธ ํ‚ค, ํ•„๋“œ ๋ฐ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ๋™์•ˆ ๋ฐฑ์—… Realm์—์„œ ํ•ด๋‹น ํ•„๋“œ์˜ ์ตœ์‹  ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ "๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์‹œ๊ฐ„" ์ดํ›„์— ๋ฐœ์ƒํ•œ ๋ชจ๋“  Update ์ด๋ฒคํŠธ๋ฅผ "๋‹ค์‹œ ์ž‘์„ฑ"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋กœ ํ•„๋“œ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ ์˜์—ญ์—์„œ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๋กœ์ปฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์ฃผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ collection์„ ์ €์žฅํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋ชจ๋ธ์— 'lastUpdated' ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

๋Œ์•„๊ฐ€๊ธฐ

๋™๊ธฐํ™” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ