๋๊ธฐํ ๊ตฌ๋ ๊ด๋ฆฌ - React Native SDK
์ด ํ์ด์ง์ ๋ด์ฉ
- ์ ์ ์กฐ๊ฑด
- ๋ฐฑ์๋ ์ฑ๊ณผ ๊ตฌ๋ ์ ๋ ฌ
- ์ฟผ๋ฆฌ ๊ตฌ๋
- ์ฟผ๋ฆฌ ๊ตฌ๋
- ์ฟผ๋ฆฌ ๊ตฌ๋ ์ด ๋๊ธฐํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ
- ์ฟผ๋ฆฌ ๊ตฌ๋ ์ทจ์
- ์๋์ผ๋ก ๊ตฌ๋ ๊ด๋ฆฌํ๊ธฐ
- ๋ชจ๋ ๊ตฌ๋ ์ ์ก์ธ์ค
- ๊ตฌ๋ ์ถ๊ฐ
- ์ด๊ธฐ ๊ตฌ๋ ์ผ๋ก Realm ๊ตฌ์ฑ
- ๊ตฌ๋ ์ํ ํ์ธ
- ๊ตฌ๋ ์ํ "์๋ฃ"
- ์ ์ฟผ๋ฆฌ๋ก ๊ตฌ๋ ์ ๋ฐ์ดํธํ๊ธฐ
- ๊ตฌ๋ ์ ๊ฑฐ
- ์ฟผ๋ฆฌ๋ก ๊ตฌ๋ ์ ๊ฑฐ
- ์ด๋ฆ์ผ๋ก ๊ตฌ๋ ์ ๊ฑฐ
- ์ฐธ์กฐ๋ก ๊ตฌ๋ ์ ๊ฑฐ
- ๊ฐ์ฒด ์ ํ์์ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
- ์ด๋ฆ ์๋ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
- ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
- ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
- API ํจ์จ์ฑ
- ์ฑ๋ฅ ํฅ์์ ์ํ ๊ทธ๋ฃน ์ ๋ฐ์ดํธ
- Flexible Sync RQL ์๊ตฌ ์ฌํญ ๋ฐ ์ ํ ์ฌํญ
- ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ๊ตฌ๋ ์๊ตฌ ์ฌํญ
- Flexible Sync์์ ์ง์๋์ง ์๋ ์ฟผ๋ฆฌ ์ฐ์ฐ์
- ๋ชฉ๋ก ์ฟผ๋ฆฌ
- ์๋ฒ ๋๋ ๋๋ ๋งํฌ๋ ๊ฐ์ฒด
- ์ฟผ๋ฆฌ ํฌ๊ธฐ ์ ํ
Flexible Sync๋ ๊ตฌ๋
๋ฐ ๊ถํ์ ์ฌ์ฉํ์ฌ ์ฑ๊ณผ ๋๊ธฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. Flexible Sync๊ฐ ํ์ฑํ๋ ์์ญ์์ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ (write)๋ฅผ ํ๋ ค๋ฉด ๋จผ์ ๊ตฌ๋
์ด ํ๋ ์ด์ ์์ด์ผ ํฉ๋๋ค. @realm/react
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋๊ธฐํ ๊ตฌ๋
์ ๋ํ ๊ถํ ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
์ฟผ๋ฆฌ ๊ตฌ๋ ์ ์ถ๊ฐ, ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐํ์ฌ ํด๋ผ์ด์ธํธ ๊ธฐ๊ธฐ์ ๋๊ธฐํํ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. Realm.js v12.0.0 ์ด์์์๋ ์๋์ผ๋ก ๊ตฌ๋ ์ ๊ด๋ฆฌํ๋ ๋์ ๋๋ ์ถ๊ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ ํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ์์ง ๋ฐ ๋น๋์นญ ๊ฐ์ฒด ๋ App Services ๋ฐฑ์๋ ๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฏ๋ก ๊ตฌ๋ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์
Flexible Sync ์ฟผ๋ฆฌ ์ ํ ์ฌํญ
Flexible Sync ๊ตฌ๋ ์ RQL ์ฟผ๋ฆฌ ์ฐ์ฐ์์ ํ์ ์งํฉ๋ง ์ง์ํฉ๋๋ค. ์ง์๋์ง ์๋ ์ฐ์ฐ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Flexible Sync RQL ์ ํ ์ฌํญ ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ ์ ์กฐ๊ฑด
React Native SDK์ ํจ๊ป Atlas Device Sync๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ๋ค์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
MongoDB 5.0 ์ด์์์คํ ํ๋ ๋น์ค๋ํ Atlas cluster .
Realm.js v10.12.0 ๋๋ ๊ทธ ์ดํ ๋ฒ์ .
React Native ํด๋ผ์ด์ธํธ์ Flexible Sync ๊ตฌ๋ ์ ์ถ๊ฐํ๋ ค๋ฉด:
๋ฐฑ์๋ ์ฑ๊ณผ ๊ตฌ๋ ์ ๋ ฌ
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ตฌ๋ ์ฟผ๋ฆฌ๋ ๋ฐฑ์๋ App Services ์ฑ์ Device Sync ๊ตฌ์ฑ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
๊ตฌ๋ ์ฟผ๋ฆฌ๋ ํด๋น ์ ํ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ํ๋ ์ด์์ ์ฟผ๋ฆฌ ๊ฐ๋ฅํ ํ๋๊ฐ ํฌํจ๋ Realm Query Language ์ฟผ๋ฆฌ๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ๊ตฌ์ฑ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด App Services ๋ฌธ์์์ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๋ฅผ ์ฐธ์กฐํ์ธ์.
Flexible Sync์ ํจ๊ป Realm Query Language๋ฅผ ์ฌ์ฉํ ๋์ ์ ํ ์ฌํญ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด Flexible Sync RQL ์ ํ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ธ์.
์ฟผ๋ฆฌ ๊ตฌ๋
๋ฒ์ realm@12.0.0
์ ์๋ก์ด ๊ธฐ๋ฅ
realm@12.0.0
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋
ํ๊ฑฐ๋ ๊ตฌ๋
์ทจ์ํ๋ ์คํ์ API ์ถ๊ฐ. ์ด๋ฌํ API๋ ์๋์ผ๋ก ๊ตฌ๋
์ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ์ธ๋ถ ์ฌํญ์ ๋จ์ํํฉ๋๋ค.
๋ชจ๋ ๊ตฌ๋ ์ ์ธ์ฆ๋ ์ฌ์ฉ์์ Flexible Sync ์์ญ์ด ํ์ํฉ๋๋ค.
๋ฒ์ realm@12.3.0
์์ ๋ณ๊ฒฝ๋จ: Atlas Device Sync์์ ์ง์๋๋ ์ง๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ดํฐ
Realm.js v12.3.0 ์ด์์์๋ ์ง๋ฆฌ ๊ณต๊ฐ์ ์ฟผ๋ฆฌ์ ๋ํ ๊ตฌ๋ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด์ ๋ฒ์ ์ SDK์์ ์ง๋ฆฌ ๊ณต๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ ํ๋ ค๊ณ ํ๋ฉด ๋ณด์ ์ฉ ์ฐ๊ธฐ์ ํจ๊ป ์๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ง๋ฆฌ ๊ณต๊ฐ์ - React Native SDK๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฟผ๋ฆฌ ๊ตฌ๋
๊ตฌ๋ ์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ๋ ์ ๋ ์ฝ๊ฒ ์ฐพ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ตฌ๋ ์ด๋ฆ์ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ๊ตฌ๋ ๊ณผ ๋์ผํ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ ์ ์ถ๊ฐํ๋ ค๋ฉด ๊ธฐ์กด ๊ตฌ๋ ์ ๋ฎ์ด์๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ธ์:
์ฝ๊ณ ์ฐ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค.
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ํด
subscribe()
ํธ์ถํ์ฌ ์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๊ฐ์ฒด์ ๋ํ ๋๊ธฐํ ๊ตฌ๋ ์ ๋ง๋ญ๋๋ค.SubscriptionOptions
๊ฐ์ฒด์name
์์ฑ์ ํฌํจ์์ผsubscribe()
ํจ์์ ์ ๋ฌํฉ๋๋ค.
import React, {useEffect, useState} from 'react'; import {useRealm, useQuery} from '@realm/react'; import {View, Text, FlatList} from 'react-native'; import {Bird} from '../../models'; import {Subscription} from 'realm/dist/bundle'; export const BasicSubscription = () => { const realm = useRealm(); // Get all local birds that have not been seen yet. const seenBirds = useQuery(Bird, collection => collection.filtered('haveSeen == true'), ); const [seenBirdsSubscription, setSeenBirdsSubscription] = useState<Subscription | null>(); useEffect(() => { // Create an async function so that we can `await` the // promise from `.subscribe()`. const createSubscription = async () => { await seenBirds.subscribe({ name: 'Birds I have seen', }); }; createSubscription().catch(console.error); // Get the subscription... const subscription = realm.subscriptions.findByName('Birds I have seen'); // ... and set it to a stateful variable or manage it in `useEffect`. setSeenBirdsSubscription(subscription); }, []); return ( // Work with the subscribed results list or modify the subscription... <></> ); };
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ตฌ๋
์ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ฆ์ด null
๋ก ์ค์ ๋ฉ๋๋ค.
์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ฟผ๋ฆฌ ๊ตฌ๋
์ filtered()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ตฌ๋
์๋ณ์๋ filtered
์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค subscribe()
๊ฐ ์ ๊ตฌ๋
์ ์์ฑํ๋ค๋ ์๋ฏธ์
๋๋ค.
API ์ฐธ์กฐ
์ฟผ๋ฆฌ ๊ตฌ๋ ์ด ๋๊ธฐํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋
ํ๋ ๊ฒฝ์ฐ ๋๊ธฐํ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๋ก๋๋ ๋๊น์ง ๊ฒฐ๊ณผ์๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋์ง ์์ต๋๋ค. ๋๊ธฐํ๋ ๊ฐ์ฒด์ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ waitForSync
์ต์
์ ๊ตฌ์ฑํฉ๋๋ค.
์ด ์์์์๋ ๊ธฐ๋ณธ ๋์์ธ FirstTime
์ต์
์ ์ฌ์ฉํฉ๋๋ค. FirstTime
๋์์ด ์๋ ๊ตฌ๋
์ ๊ตฌ๋
์ด ์ฒ์ ์์ฑ๋ ๋ ๋๊ธฐํ๊ฐ ์๋ฃ๋ ๋๊น์ง๋ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
import React, {useEffect, useState} from 'react'; import {BSON, WaitForSync} from 'realm'; import {useRealm, useQuery} from '@realm/react'; import {View, Text, Button, TextInput, FlatList} from 'react-native'; import {Bird} from '../../models'; import {Subscription} from 'realm/dist/bundle'; export const WaitFirstTime = () => { const realm = useRealm(); const [birdName, setBirdName] = useState('Change me!'); // Get local birds that have been marked as "haveSeen". const seenBirds = useQuery(Bird, collection => collection.filtered('haveSeen == true'), ); const [seenBirdsSubscription, setSeenBirdsSubscription] = useState<Subscription | null>(); useEffect(() => { const createSubscription = async () => { // Only wait for sync to finish on the initial sync. await seenBirds.subscribe({ behavior: WaitForSync.FirstTime, name: 'First time sync only', }); }; createSubscription().catch(console.error); // Get the subscription... const subscription = realm.subscriptions.findByName('First time sync only'); // ... and set it to a stateful variable or manage it in `useEffect`. setSeenBirdsSubscription(subscription); }, []); return ( // Work with the subscribed results list or modify the subscription... <></> ); };
์ง์๋๋ ๋ค๋ฅธ WaitForSync
์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Always
: ์ฑ์ด ์คํ๋ ๋๋ง๋ค ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ฑ์ ์คํํ ๋๋ง๋ค ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค.Never
: ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ์ง ๋ง์ธ์. ์ฑ์ ์ฒ์ ์คํํ ๋๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆํ๊ธฐ ์ํด ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ํ์ํ์ง๋ง, ์ดํ ์คํ ์ ์บ์๋ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์คํ๋ผ์ธ์ผ๋ก ์ด ์ ์์ต๋๋ค.
์ ํ์ ์ผ๋ก timeout
๊ฐ์ ์ง์ ํ์ฌ ๋๊ธฐํ ๋ค์ด๋ก๋๊ฐ ์คํ๋๋ ์๊ฐ์ ์ ํํ ์ ์์ต๋๋ค.
export const AlwaysWait = () => { const realm = useRealm(); // Get all local birds that have not been seen yet. const unSeenBirds = useQuery(Bird, collection => collection.filtered('haveSeen == false'), ); const [unSeenBirdsSubscription, setUnseenBirdsSubscription] = useState<Subscription | null>(); useEffect(() => { const createSubscription = async () => { // Add subscription with timeout. // If timeout expires before sync is completed, currently-downloaded // objects are returned and sync download continues in the background. await unSeenBirds.subscribe({ behavior: WaitForSync.Always, name: 'Always wait', timeout: 500, }); }; createSubscription().catch(console.error); // Get the subscription... const subscription = realm.subscriptions.findByName('Always wait'); // ... and set it to a stateful variable or manage it in `useEffect`. setUnseenBirdsSubscription(subscription); }, []); return ( // Work with the subscribed results list or modify the subscription... <></> ); };
API ์ฐธ์กฐ
์ฟผ๋ฆฌ ๊ตฌ๋ ์ทจ์
๊ตฌ๋
์ ์ทจ์ํ์ง ์๋ ํ ๊ตฌ๋
์ ์ฌ์ฉ์ ์ธ์
์ ๋ฐ์ ๊ฑธ์ณ ์ ์ง๋ฉ๋๋ค. unsubscribe()
์(๋ฅผ) ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ตฌ๋
์ ์ทจ์ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋์ผ๋ก ๊ตฌ๋ ์ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ํ์ฑ ๊ตฌ๋ ๋ชฉ๋ก์์ ๊ตฌ๋ ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
๊ฒน์น๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ๋ค๋ฅธ ๊ตฌ๋
์ด ์๋ ๊ฒฝ์ฐ unsubscribe()
์(๋ฅผ) ํธ์ถํ ํ์๋ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ์ฌ์ ํ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
unsubscribe()
์(๋ฅผ) ํธ์ถํ๋ฉด ์ฐ๊ฒฐ๋ ๊ตฌ๋
์ด ์ ๊ฑฐ๋ฉ๋๋ค. ๊ตฌ๋
์ ์ด๋ฆ์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค. ์ด๋ฆ์ด ์์ผ๋ฉด unsubscribe()
์(๋) unsubscribe()
์(๋ฅผ) ํธ์ถํ ์ฟผ๋ฆฌ์ ์ ํํ ์ผ์นํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํฉ๋๋ค.
์ ๊ฑฐ๋ ๊ตฌ๋
๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๊ฐ ์์ญ์์ ์ญ์ ๋๊ธฐ ์ ์ unsubscribe()
๋ฉ์๋๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๊ธฐํ๋ ์ ๊ตฌ๋
์ธํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์๋ฉ๋๋ค.
import React, {useEffect, useState} from 'react'; import {useRealm, useQuery} from '@realm/react'; import {View, Text, Button} from 'react-native'; import {Bird} from '../../models'; import {Subscription} from 'realm/dist/bundle'; export const Unsubscribe = () => { const realm = useRealm(); const birds = useQuery(Bird); const unsubscribeFromQuery = () => { birds.unsubscribe(); }; return ( <View> <Button title="Unsubscribe" onPress={() => { unsubscribeFromQuery(); }} /> </View> ); };
API ์ฐธ์กฐ
์๋์ผ๋ก ๊ตฌ๋ ๊ด๋ฆฌํ๊ธฐ
๊ตฌ๋ API ๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ์ ํน์ ์ฟผ๋ฆฌ์ ๋ํ ๊ตฌ๋ ์ค์ ํ๋ค ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌ ์์ต๋๋ค.
Realm.subscriptions ์ฟผ๋ฆฌ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ์ ๋ํ ํน์ ์ฟผ๋ฆฌ์ ๋ํ ๊ตฌ๋ ์ค์ ํ๋ค ๋ฅผ ๊ด๋ฆฌ ํ๋ API ์ ๋๋ค.
@realm/react
์(๋ฅผ) ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋ ์์ญProvider ๋ด์์ ์์ญ ๊ตฌ๋
์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. use์์ญ() ํ
์ ์ฌ์ฉํ๋ฉด ํ์ฌ ์ด๋ ค ์๋ ์์ญ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ตฌ๋ ์ผ๋ก ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
๋ฐ์ดํฐ๊ฐ ๊ตฌ๋ ๊ณผ ์ผ์นํ๊ณ ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ, Device Sync๋ ๋ฐฑ์๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ฑ๊ณผ ๋๊ธฐํํฉ๋๋ค.
๊ตฌ๋ ์ ์์ฑํ๋ฉด Realm์ ํน์ ๊ฐ์ฒด ์ ํ์ ๋ํ ์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ๊ฐ์ฒด ์ ํ์ ๋ํ ๊ตฌ๋ ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋์ผํ ๊ฐ์ฒด ์ ํ์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
์ค์
๊ฐ์ฒด ๋งํฌ
๋งํฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ ค๋ฉด ๊ฐ์ฒด์ ํด๋น ๋งํฌ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ๊ตฌ๋ ์ธํธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ตฌ๋ ๊ฒฐ๊ณผ์ ๊ฒฐ๊ณผ์ ํฌํจ๋์ง ์์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋๋ ์์ฑ์ด ์๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ํด๋น ๋งํฌ๋ null๋ก ํ์๋ฉ๋๋ค. ํด๋น ์์ฑ ๊ฐ์ด ์ค์ null์ธ์ง, ์๋๋ฉด ๋งํฌ๋ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง๋ง ์ฟผ๋ฆฌ ๊ตฌ๋ ์ ํ์ ์์ญ์์ ๋ฒ์ด๋ ๊ฒ์ธ์ง ๊ตฌ๋ถํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ชจ๋ ๊ตฌ๋ ์ ์ก์ธ์ค
Flexible Sync๋ฅผ ์ํด ๊ตฌ์ฑ๋ RealmProvider
๋ด์์ SubscriptionSet
์ ์ก์ธ์คํ ์ ์์ต๋๋ค. SubscriptionSet์ ์ฑ์ ๋ํ ๋ชจ๋ ๊ตฌ๋
์ ์ปฌ๋ ์
์
๋๋ค.
import React, {useEffect, useState} from 'react'; import {Text, FlatList} from 'react-native'; import {useRealm, useQuery} from '@realm/react'; import {Bird} from '../Models/Bird'; function SubscriptionManager() { const realm = useRealm(); // Pass object model to useQuery and filter results. // This does not create a subscription. const seenBirds = useQuery(Bird, birds => { return birds.filtered('haveSeen == true'); }); const [subscriptions, setSubcriptions] = useState< App.Sync.SubscriptionSet | undefined >(); useEffect(() => { const createSubscription = async () => { // Create subscription for filtered results. await realm.subscriptions.update(mutableSubs => { mutableSubs.add(seenBirds, {name: 'seen birds'}); }); }; createSubscription().catch(console.error); // Set to state variable. setSubcriptions(realm.subscriptions); }, []); return ( <FlatList data={subscriptions} keyExtractor={subscription => subscription.id.toString()} renderItem={({item}) => <Text>{item.name}</Text>} /> ); }
API ์ฐธ์กฐ
๊ตฌ๋ ์ถ๊ฐ
๋ค์ ์์์์๋ completed
๋ฐ progressMinutes
์ด(๊ฐ) App Services App์์ ์ฟผ๋ฆฌ ๊ฐ๋ฅํ ํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ฝ๋์์ ํํฐ๋ง๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋ค์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋
ํฉ๋๋ค.
์๋ฃ๋ ์์
120 ์ด์ ๊ฑธ๋ฆฐ ์๋ฃ๋ ์์
progressMinutes
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ค๋ฉด useQuery()
์ ํ์ฑ ๊ตฌ๋
์ด ํ์ํฉ๋๋ค. ์์ง ๊ตฌ๋
์ด ์ถ๊ฐ๋์ง ์์ ๊ฒฝ์ฐ useQuery()
์(๋) MutableSubscriptionSet.add()
์ ๋ํด ์ ํจํ query
์ด(๊ฐ) ์๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
import React, {useEffect} from 'react'; import {Text, FlatList} from 'react-native'; import {useRealm, useQuery} from '@realm/react'; function SubscriptionManager() { const realm = useRealm(); const seenBirds = useQuery(Bird, birds => { return birds.filtered('haveSeen == true'); }); useEffect(() => { realm.subscriptions.update( (mutableSubs: Realm.App.Sync.MutableSubscriptionSet) => { // Create subscription for filtered collection. mutableSubs.add(seenBirds, {name: 'seenBirds'}); }, ); }); return ( <FlatList data={seenBirds} keyExtractor={item => item._id.toString()} renderItem={({item}) => <Text>{item._id.toString()}</Text>} /> ); }
์ด๊ธฐ ๊ตฌ๋ ์ผ๋ก Realm ๊ตฌ์ฑ
Flexible Sync ์์ญ์์ ์ฝ๊ฑฐ๋ ์ฐ๋ ค๋ฉด ๋จผ์ ๊ตฌ๋ ์ด ํ๋ ์ด์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ธฐ ๊ตฌ๋ ์ ์ฌ์ฉํ๋ฉด ๋๊ธฐํ๋ ์์ญ์ ๊ตฌ์ฑํ ๋ ๊ตฌ๋ ์ ์ ์ํ ์ ์์ต๋๋ค.
์ด๊ธฐ ๊ตฌ๋
์ผ๋ก ๋๊ธฐํ๋ ์์ญ์ ์ด๋ ค๋ฉด initialSubscriptions
์์ฑ์ RealmProvider
์ ๋๊ธฐํ ๊ตฌ์ฑ์ ์ถ๊ฐํฉ๋๋ค.
์ด๊ธฐ ๊ตฌ๋
์ ์ค์ ํ ๋ @realm/react
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ
useQuery
๋ฐ useObject
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ Realm.js ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ (write) ์์
์ ์ฌ์ฉํ์ธ์.
import React from 'react'; import {AppProvider, UserProvider} from '@realm/react'; // get realm context from createRealmContext() import {RealmContext} from '../RealmConfig'; import {Text, FlatList} from 'react-native'; const {RealmProvider, useQuery} = RealmContext; function AppWrapper() { return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider sync={{ flexible: true, initialSubscriptions: { update(subs, realm) { subs.add(realm.objects('Turtle')); }, }, onError: console.log, }}> <SubscriptionManager /> </RealmProvider> </UserProvider> </AppProvider> ); } function SubscriptionManager() { // Pass object model to useQuery to get all objects of type `Turtle`. // These results automatically update with changes from other devices // because we created a subscription with `initialSubscriptions`. const allTurtles = useQuery('Turtle'); return ( <FlatList data={allTurtles} keyExtractor={turtle => turtle._id.toString()} renderItem={({item}) => <Text>{item._id}</Text>} /> ); }
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ธฐ ๊ตฌ๋
์ ์์ญ์ด ์ฒ์ ์ด๋ฆด ๋๋ง ์์ฑ๋ฉ๋๋ค. ์ฑ์ด ์์๋ ๋๋ง๋ค ์ด ์ด๊ธฐ ๊ตฌ๋
์ ๋ค์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ rerunOnOpen
์(๋ฅผ) true
(์ผ)๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๋์ ์๊ฐ ๋ฒ์ ๋๋ ๊ตฌ๋
์ ๋ํ ์ ์ ๋ณ์๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ ๊ธฐํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์คํํ๋ ค๋ฉด ์ด ์์
์ ์ํํด์ผ ํ ์ ์์ต๋๋ค.
API ์ฐธ์กฐ
๊ตฌ๋ ์ํ ํ์ธ
๊ตฌ๋ ์ํ ๋ฅผ ํ์ธํ์ฌ ์๋ฒ ๊ฐ ๊ตฌ๋ ์ ์น์ธํ๋์ง, ์ฅ์น๊ฐ ๋ก์ปฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๊ตฌ๋ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
Trigger error handling
ํธ๋์ญ์ ์ด ๋ณด๋ฅ ์ค์ธ์ง ๋๋ ์๋ฃ๋์๋์ง ํ์
๊ตฌ๋ ์ธํธ ๋์ฒด ์๊ธฐ๋ฅผ ํ์ธํ๊ณ ๊ตฌ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฑํ๋ ค๋ฉด ํด๋น ๊ตฌ๋ ์ธํธ์ ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค
import React, {useEffect} from 'react'; import {Text, View} from 'react-native'; import {useRealm, useQuery} from '@realm/react'; import {Bird} from '../Models/Bird'; function SubscriptionManager() { const realm = useRealm(); const seenBirds = useQuery(Bird, birds => { return birds.filtered('haveSeen == true'); }); useEffect(() => { realm.subscriptions.update( (mutableSubs: Realm.App.Sync.MutableSubscriptionSet) => { // Create subscription for filtered collection. mutableSubs.add(seenBirds, {name: 'seenBirds'}); }, ); }); // Returns state of all subscriptions, not individual subscriptions. // In this case, it's just the subscription for `Bird` objects where // `haveSeen` is true. const allSubscriptionState = realm.subscriptions.state; return ( <View> <Text > Status of all subscriptions: {allSubscriptionState} </Text> </View> ); }
๋ฒ์ realm@12.0.0
์ ์๋ก์ด ๊ธฐ๋ฅ
Realm.js v12.0.0 ๊ตฌ๋ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ตฌ๋ ์ด๊ฑฐํ ์ ์ถ๊ฐํ์ต๋๋ค.
๊ตฌ๋ ์ํ "์๋ฃ"
๊ตฌ๋ ์ธํธ ์ํ "์๋ฃ" ๋ "๋๊ธฐํ๊ฐ ์๋ฃ๋จ" ๋๋ "๋ชจ๋ ๋ฌธ์๊ฐ ๋๊ธฐํ๋จ" ์ ์๋ฏธํ์ง ์์ต๋๋ค. "์๋ฃ" ๋ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์๋ฏธํฉ๋๋ค:
๊ตฌ๋ ์ด ํ์ฌ ์๋ฒ์ ๋๊ธฐํ๋๊ณ ์๋ ํ์ฑ ๊ตฌ๋ ์ธํธ๊ฐ
์ด์ ๊ตฌ๋ ์ด ์๋ฒ๋ก ์ ์ก๋ ๋ ๊ตฌ๋ ๊ณผ ์ผ์นํ๋ ๋ฌธ์๊ฐ ๋ก์ปฌ ์ฅ์น์ ์กด์ฌํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ฌ ๊ตฌ๋ ๊ณผ ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์๊ฐ ๋ฐ๋์ ํฌํจ๋๋ ๊ฒ์ ์๋๋๋ค.
Realm SDK๋ ๊ตฌ๋ ๊ณผ ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์๊ฐ ๊ธฐ๊ธฐ์ ๋๊ธฐํ๋์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ ์ฟผ๋ฆฌ๋ก ๊ตฌ๋ ์ ๋ฐ์ดํธํ๊ธฐ
์ ์ฟผ๋ฆฌ๋ก ์ด๋ฆ์ด ์ง์ ๋ ๊ตฌ๋
์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๊ตฌ๋
์ฟผ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธํ๋ ค๋ฉด ์
๋ฐ์ดํธํ๋ ค๋ ๊ตฌ๋
์ด๋ฆ๊ณผ ํจ๊ป ์ ์ฟผ๋ฆฌ์ ๊ตฌ๋
์ต์
์ MutableSubscriptionSet.add()
๋ฉ์๋์ ์ ๋ฌํฉ๋๋ค. ์ ๊ตฌ๋
์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก subscriptions.update()
๋ฅผ ํธ์ถํ์ฌ ํธ๋์ญ์
๋ด์์ ๊ตฌ๋
์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
๋ค์ ์์์๋ ์ฅ๊ธฐ ์คํ ์์ ์ 180๋ถ ์ด์ ๊ฑธ๋ฆฌ๋ ์์ ์ผ๋ก ์ฌ์ ์ํฉ๋๋ค.
realm.subscriptions.update((mutableSubs) => { mutableSubs.add( tasks.filtered('status == "completed" && progressMinutes > 180'), { name: "longRunningTasksSubscription", } ); });
์ฐธ๊ณ
SubscriptionOptions.throwOnUpdate
ํ๋๊ฐ true๋ก ์ค์ ๋ ๊ตฌ๋
์ ์
๋ฐ์ดํธํ๋ ค๊ณ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
API ์ฐธ์กฐ
๊ตฌ๋ ์ ๊ฑฐ
๊ตฌ๋ ์ธํธ๋ ๋ ์ด์ ์ฝ๋์ ๊ตฌ๋ ์ ํฌํจํ์ง ์๋๋ผ๋ ์ธ์ ์ ๋ฐ์ ๊ฑธ์ณ ์ ์ง๋ฉ๋๋ค. ๊ตฌ๋ ์ ๋ณด๋ ๋๊ธฐํ๋ ์์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค. ์ผ์นํ๋ ๋ฐ์ดํฐ ๋๊ธฐํ ์๋๋ฅผ ์ค์งํ๋ ค๋ฉด ๊ตฌ๋ ์ ๋ช ์์ ์ผ๋ก ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ๋ ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
ํน์ ์ฟผ๋ฆฌ๋ก ๋จ์ผ ๊ตฌ๋ ์ ๊ฑฐ
ํน์ ์ด๋ฆ์ผ๋ก ๋จ์ผ ๊ตฌ๋ ์ ๊ฑฐ
ํน์ ๊ฐ์ฒด ๋ชจ๋ธ์ ๋ํ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
์ด๋ฆ ์๋ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
๋ชจ๋ ๊ตฌ๋ ์ญ์
๊ตฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ฅ์น์์ ๋๊ธฐํ๋ ๋ฐ์ดํฐ๋ ์ ๊ฑฐํฉ๋๋ค.
์ด ์น์
์ ์์์์๋ @realm/react
๋ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋ RealmProvider๋ก ์์
ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
import {useEffect} from 'react'; // get realm context from createRealmContext() import {RealmContext} from '../RealmConfig'; const {useRealm} = RealmContext; function SubscriptionManager() { const realm = useRealm(); useEffect(() => { realm.subscriptions.update(mutableSubs => { // Remove subscription for object type `Turtle`, // which we added in `initialSubscriptions`. mutableSubs.removeByObjectType('Turtle'); }); }); return ( // ... ); }
์ฟผ๋ฆฌ๋ก ๊ตฌ๋ ์ ๊ฑฐ
๊ตฌ๋ ์ค์ ํ๋ค ์์ ํธ๋์ญ์ ์ ์คํํ์ฌ ์ฟผ๋ฆฌ ๋ฅผ ํตํด ํน์ ๊ตฌ๋ ์ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ๋ฅผ MutableSubscriptionSet์ ์ ๋ฌํฉ๋๋ค. ์ฐ๊ธฐ ํธ๋์ญ์ ( ์ฐ๊ธฐ ํธ๋์ญ์ (write transaction)) ๋ด์์ ()์(๋ฅผ) ์ ๊ฑฐ ํฉ๋๋ค.
realm.subscriptions.update((mutableSubs) => { // remove a subscription with a specific query mutableSubs.remove(tasks.filtered('owner == "Ben"')); });
์ด๋ฆ์ผ๋ก ๊ตฌ๋ ์ ๊ฑฐ
์ด๋ฆ์ผ๋ก ํน์ ๊ตฌ๋ ์ ์ ๊ฑฐ ํ๋ ค๋ฉด ๊ตฌ๋ ์ค์ ํ๋ค ์์ ํธ๋์ญ์ ์ ์คํํฉ๋๋ค. ํธ๋์ญ์ ๋ด์์ ์ด๋ฆ์ MutableSubscriptionSet.removeByName()์ ์ ๋ฌํฉ๋๋ค.
realm.subscriptions.update((mutableSubs) => { // remove a subscription with a specific name mutableSubs.removeByName("longRunningTasksSubscription"); });
์ฐธ์กฐ๋ก ๊ตฌ๋ ์ ๊ฑฐ
๊ตฌ๋ ์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ๊ตฌ๋ ์ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๊ตฌ๋ ์ค์ ํ๋ค ์์ ํธ๋์ญ์ ์ ์คํํฉ๋๋ค. ํธ๋์ญ์ ๋ด์์ ์ฐธ์กฐ ๋ณ์๋ฅผ MutableSubscriptionSet.removeSubscription()์ ์ ๋ฌํฉ๋๋ค.
let subscriptionReference; realm.subscriptions.update((mutableSubs) => { subscriptionReference = mutableSubs.add(realm.objects("Task")); }); // later.. realm.subscriptions.removeSubscription(subscriptionReference);
๊ฐ์ฒด ์ ํ์์ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
ํน์ ๊ฐ์ฒด ์ ํ์ ๋ํ ๋ชจ๋ ๊ตฌ๋ ์ ์ ๊ฑฐํ๋ ค๋ฉด ๊ตฌ๋ ์ธํธ์์ ํธ๋์ญ์ ์ ์คํํฉ๋๋ค. ํธ๋์ญ์ ๋ด์์ ๊ฐ์ฒด ์ ํ์ string ๋ก MutableSubscriptionSet.removeByObjectType()์ ์ ๋ฌํฉ๋๋ค.
realm.subscriptions.update((mutableSubs) => { mutableSubs.removeByObjectType("Team"); });
์ด๋ฆ ์๋ ๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
๋ฒ์ realm@v12.0.0
์ ์๋ก์ด ๊ธฐ๋ฅ
์ผ์์ ์ด๊ฑฐ๋ ๋์ ์ผ๋ก ์์ฑ๋ ์ด๋ฆ ์๋ ๊ตฌ๋ ์ ์ ๊ฑฐํ๊ณ ์ด๋ฆ์ด ์ง์ ๋ ๊ตฌ๋ ์ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
mutableSubs
์์ .removeUnnamed()
์(๋ฅผ) ํธ์ถํ์ฌ ๊ตฌ๋
์ธํธ์์ ๋ช
๋ช
๋์ง ์์ ๋ชจ๋ ๊ตฌ๋
์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. .removeUnnamed()
์(๋) ์ ๊ฑฐ๋ ๋ช
๋ช
๋์ง ์์ ๊ตฌ๋
์๋ฅผ ๋ฐํํฉ๋๋ค.
// Remove unnamed subscriptions. let numberRemovedSubscriptions = 0; await realm.subscriptions.update((mutableSubs) => { numberRemovedSubscriptions = mutableSubs.removeUnnamed(); });
API ์ฐธ์กฐ
๋ชจ๋ ๊ตฌ๋ ์ ๊ฑฐ
๊ตฌ๋ ์ธํธ์์ ๋ชจ๋ ๊ตฌ๋ ์ ์ ๊ฑฐํ๋ ค๋ฉด ๊ตฌ๋ ์ธํธ์์ ํธ๋์ญ์ ์ ์คํํฉ๋๋ค. ์ฐ๊ธฐ ํธ๋์ญ์ (write transaction) ๋ด์์ MutableSubscriptionSet.removeAll() ์ ํธ์ถํฉ๋๋ค.
realm.subscriptions.update((mutableSubs) => { mutableSubs.removeAll(); });
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
API ํจ์จ์ฑ
์ฟผ๋ฆฌ ๊ตฌ๋
์น์
์ ์ค๋ช
๋ subscribe()
๋ฐ unsubscribe()
API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ตฌ๋
์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋์ผ๋ก ๊ตฌ๋
์ ๊ด๋ฆฌํ ๋ ๋ฐฐ์น ์
๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ฑ์ด ๋จ์ด์ง๋๋ค.
๊ตฌ๋
์ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝํ ๋ ์ฑ๋ฅ์ ํฅ์ํ๋ ค๋ฉด subscriptions
API๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ํธ๋์ญ์
์ผ๋ก ๋ชจ๋ ๊ตฌ๋
์ ์
๋ฐ์ดํธํฉ๋๋ค. ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ์๋์ผ๋ก ๊ตฌ๋
๊ด๋ฆฌํ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฑ๋ฅ ํฅ์์ ์ํ ๊ทธ๋ฃน ์ ๋ฐ์ดํธ
๊ตฌ๋ ์ธํธ์ ๋ํ ๋ชจ๋ ์ฐ๊ธฐ ํธ๋์ญ์ (write transaction)์๋ ์ฑ๋ฅ์ด ์๋ชจ๋ฉ๋๋ค. ์ธ์ ์ค์ ์์ญ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ณ๊ฒฝ์ด ์๋ฃ๋ ๋๊น์ง ํธ์งํ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ ๋์ ์์ ํ๊ณ ์ ๋ฐ์ดํธ๋ ๊ฐ์ฒด๋ง ์์ญ์ ๊ธฐ๋กํ๋ฏ๋ก ๋๊ธฐํ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
Flexible Sync RQL ์๊ตฌ ์ฌํญ ๋ฐ ์ ํ ์ฌํญ
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ๊ตฌ๋ ์๊ตฌ ์ฌํญ
์ฑ์ ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ๋ ฅํ๊ฒ ๋ถํ ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ฐ๋จํ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด user_id == $0, โ641374b03725038381d2e1fbโ
์ ๊ฐ์ด ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ, ์คํ ์ด ๋๋ ์ฌ์ฉ์์ ๊ฐ๋ ฅํ๊ฒ ๋งคํํ๋ ์ฑ์ ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋์ ์ข์ ํ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋์๋ ์ฟผ๋ฆฌ ๊ตฌ๋
์ ์ฌ์ฉํ๊ธฐ ์ํ ํน์ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๋ ๋ชจ๋ ๊ตฌ๋ ์ฟผ๋ฆฌ์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฟผ๋ฆฌ์์ ๋๋ฝ๋์ด์๋ ์ ๋ฉ๋๋ค.
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๋ ๊ตฌ๋ ์ฟผ๋ฆฌ์์ ์์์ ๋ํด
==
๋๋IN
๋น๊ต๋ฅผ ํ ๋ฒ ์ด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ดuser_id == $0, "641374b03725038381d2e1fb"
๋๋store_id IN $0, {1,2,3}
์ ๋๋ค.
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๊ฐ ==
๋๋ IN
์ ์ฌ์ฉํ์ฌ ์์์ ํ ๋ฒ ์ด์ ์ง์ ๋น๊ต๋๋ ๊ฒฝ์ฐ, ์ ํ์ ์ผ๋ก AND
๋น๊ต๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด store_id IN {1,2,3} AND region=="Northeast"
๋๋ store_id == 1 AND (active_promotions < 5 OR num_employees < 10)
์
๋๋ค.
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋์ ๋ํ ์ ํจํ์ง ์์ Flexible Sync ์ฟผ๋ฆฌ์๋ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ํฌํฉ๋ฉ๋๋ค.
์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๊ฐ
AND
๋ฅผ ๋๋จธ์ง ์ฟผ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ.์๋ฅผ ๋ค์ดstore_id IN {1,2,3} OR region=="Northeast"
์AND
๋์OR
์ ์ฌ์ฉํ๋ฏ๋ก ์ ํจํ์ง์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋กstore_id == 1 AND active_promotions < 5 OR num_employees < 10
๋AND
๊ฐ ์ ์ฒด ์ฟผ๋ฆฌ๊ฐ ์๋๋ผ ์์ ์๋ ์ฉ์ด์๋ง ์ ์ฉ๋๋ฏ๋ก ์ ํจํ์ง ์์ต๋๋ค.์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๊ฐ ๋๋ฑ ์ฐ์ฐ์์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ.์๋ฅผ ๋ค์ด
store_id > 2 AND region=="Northeast"
๋>
์ฐ์ฐ์๋ง ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋์ ์ฌ์ฉํ๊ณ ๋๋ฑ ๋น๊ต๋ ์๊ธฐ ๋๋ฌธ์ ์ ํจํ์ง ์์ต๋๋ค.์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๊ฐ ์ฟผ๋ฆฌ์์ ์์ ํ ๋๋ฝ๋ ๊ฒฝ์ฐ.์๋ฅผ ๋ค์ด
region=="Northeast
๋๋truepredicate
๋ ์ธ๋ฑ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋๋ฅผ ํฌํจํ์ง ์์ผ๋ฏ๋ก ์ ํจํ์ง ์์ต๋๋ค.
Flexible Sync์์ ์ง์๋์ง ์๋ ์ฟผ๋ฆฌ ์ฐ์ฐ์
Flexible Sync๋ RQL ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค. ๋๊ธฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ฟผ๋ฆฌ ๊ตฌ๋ ์ ์์ฑํ ๋ ์๋ฒ๋ ์ด๋ฌํ ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฒด RQL ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๊ธฐํ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
์ฐ์ฐ์ ์ ํ | ์ง์๋์ง ์๋ ์ฐ์ฐ์ |
---|---|
์ง๊ณ ์ฐ์ฐ์ |
|
์ฟผ๋ฆฌ ์ ๋ฏธ์ฌ |
|
๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ฟผ๋ฆฌ([c]
)์(๋) ์ธ๋ฑ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ฟผ๋ฆฌ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
Flexible Sync๋ ๋ฐฐ์ด ํ๋์ ๋ํด @count
๋ง ์ง์ํฉ๋๋ค.
๋ชฉ๋ก ์ฟผ๋ฆฌ
Flexible Sync๋ IN
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค.
์์ ๋ชฉ๋ก์ ์ฟผ๋ฆฌํ์ฌ ์ฟผ๋ฆฌ ๊ฐ๋ฅ ํ๋ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค:
// Query a constant list for a queryable field value "priority IN { 1, 2, 3 }"
์ฟผ๋ฆฌ ๊ฐ๋ฅํ ํ๋์ ๋ฐฐ์ด ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์ ์์ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
// Query an array-valued queryable field for a constant value "'comedy' IN genres"
๊ฒฝ๊ณ
Flexible Sync ์ฟผ๋ฆฌ์์๋ ๋ ๋ชฉ๋ก์ ๋น๊ตํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด ๊ตฌ๋ฌธ์ Flexible Sync ์ฟผ๋ฆฌ ์ธ์๋ ์ ํจํ Realm Query Language ๊ตฌ๋ฌธ์ด๋ผ๋ ์ ์ ์ ์ํ์ธ์.
// Invalid Flexible Sync query. Do not do this! "{'comedy', 'horror', 'suspense'} IN genres" // Another invalid Flexible Sync query. Do not do this! "ANY {'comedy', 'horror', 'suspense'} != ANY genres"
์๋ฒ ๋๋ ๋๋ ๋งํฌ๋ ๊ฐ์ฒด
Flexible Sync๋ ๋ด์ฅ๋ ๊ฐ์ฒด ๋๋ ๋งํฌ์ ์์ฑ์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ์์: obj1.field == "foo"
์ฟผ๋ฆฌ ํฌ๊ธฐ ์ ํ
๊ตฌ๋ ์ค์ ํ๋ค ์ ์๋ ํน์ ์ฟผ๋ฆฌ ๊ตฌ๋ ์ ํฌ๊ธฐ ์ ํ ์ 256 KB ์ ๋๋ค. ์ด ์ ํ์ ์ด๊ณผํ๋ฉด LimitsExceeded ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.