Apollo-link: [์•„ํด๋กœ-๋งํฌ-์˜คํ”„๋ผ์ธ] ๋‹น์‹ ์˜ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 10์›” 05์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๊ธฐ๋Šฅ ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์ •๋ง ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ํžŒํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” apollo-offline ๊ณผ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ํ•˜๋Š” react-native์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
(ํ•‘ https://github.com/Malpaux/apollo-offline/issues/14)

์ด ์š”์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/lachenmayer/2e364a5ca9ae0918eb032867d0c6720d

๋‹ค์Œ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

์žฅ์น˜๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์š”์ฒญ์ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜๊ณ  ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋Œ€๊ธฐ์—ด์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ( apollo-link-queue )

๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ์žฌ์‹œ๋„๋ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ฌดํ•œ). ( apollo-link-retry )
์ด๊ฒƒ์€ ์žฅ์น˜๊ฐ€ ์˜คํ”„๋ผ์ธ์ด๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋‹ค์šด๋œ ๊ฒฝ์šฐ).

๊ทธ๋Ÿฌ๋‚˜ ์บ์‹œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ optimisticFetchLink ํ•จ์ˆ˜์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ด "๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ" ๋™์ž‘์€ apollo-offline์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ํ–ฅํ›„ apollo-link-offline ๊ตฌํ˜„์€ ์ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์œ ์ง€ํ•˜๋Š” ํ•œ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ํ‰์†Œ์™€ ๊ฐ™์ด ์•ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด network-and-cache ๊ฐ€์ ธ์˜ค๊ธฐ ์ •์ฑ…์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด์–ด์•ผ ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ๊ณง ๋ณ€๊ฒฝ๋  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(https://github.com/apollographql/react-apollo/issues/ ์ฐธ์กฐ). 604#issuecomment-355648596).

์š”์ง€ ๋ฅผ offlineLink.js ๋กœ ์ €์žฅ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { InMemoryCache } from 'apollo-cache-inmemory'
import { ApolloClient } from 'apollo-client'
import { createHttpLink } from 'apollo-link-http'

// get this from https://gist.github.com/lachenmayer/2e364a5ca9ae0918eb032867d0c6720d
import { createOfflineLink } from './offlineLink'

const cache = new InMemoryCache()
const networkLink = createHttpLink()

const offlineLink = createOfflineLink({ cache })

const link = ApolloLink.from([
  // ... + other links ...
  offlineLink,
  networkLink,
])

const client = new ApolloClient({
  cache,
  link,
}

์•Œ๋ ค์ง„ ๋ฌธ์ œ/๋น„ํŠธ ๋ˆ„๋ฝ

  • ์ด๊ฒƒ์€ ํ˜„์žฌ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๋ ค๋ฉด isOnline ์ฒดํฌ๋ฅผ ์ถ”์ƒํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹œ์— ๋ถ€๋ถ„ ์‘๋‹ต๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์ด ๋ถˆ์™„์ „ํ•˜๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์–ด๋”˜๊ฐ€์—์„œ ๊ฑฐ๋ถ€๋œ ์•ฝ์†์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์‹ค์ œ๋กœ apollo-offline์ด ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์•„์ง ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์žฌ์‹œ๋„ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”๊ฐ€ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” pollo-offline์˜ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํฐ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ( {__online_: true} ์ฟผ๋ฆฌ ๋ณ€์ˆ˜ ์„ค์ •), ํ™•์‹คํžˆ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ํ…Œ์ŠคํŠธ๋„ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํƒ€์ดํ•‘, ํ…Œ์ŠคํŠธ, ๋ฌธ์„œ ๋ฐ ์ „์ฒด๊ฐ€ ํฌํ•จ๋œ ์ ์ ˆํ•œ npm ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์ œ ์ƒ๊ฐ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ, ์•„์ง apollo-client 2์— ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ์œ ๊ฐ์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ ธ์š”โœŒ๏ธ

๋ชจ๋“  38 ๋Œ“๊ธ€

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ๋ฌด์—‡์„ ๊ณ ๋ คํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜คํ”„๋ผ์ธ ์•ฑ์œผ๋กœ:

  • ๋ชจ๋“  graphql ์š”์ฒญ์ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. (์บ์‹œ์— ์ €์žฅ ๊ฐ€๋Šฅ).
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜จ๋ผ์ธ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ๋งํฌ์— ์ด์ „ ์š”์ฒญ์„ ๋‹ค์‹œ ์ œ์ถœํ•˜๋„๋ก ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์ƒ์ƒํ•œ๋‹ค.

import { NetInfo } from 'react-native';
import OfflineLink from 'apollo-link-offline';

const offlineLink = new OfflineLink({
  isOnlineAsync: () => NetInfo.isConnected.fetch(),
});

NetInfo.isConnected.addEventListener('change', (isConnected) => {
  if (isConnected) {
    offlineLink.resubmit();
  }
});

๋†€๋ผ์šด ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์ ์ธ ๋ฐฉ๋ฒ•์€ Apollo-link-offline์ด ์˜คํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฐ ๋Œ์—ฐ๋ณ€์ด ์„ธํŠธ๋ฅผ ์ •์˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋‹จ ๊ทธ๊ฒƒ๋“ค์ด ์ •์˜๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฟผ๋ฆฌ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mutations์˜ ๊ฒฝ์šฐ ์˜คํ”„๋ผ์ธ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋™์•ˆ ์˜คํ”„๋ผ์ธ์—์„œ๋„ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„œ๋น„์Šค ์›Œ์ปค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Google PWA ํ…Œ์ŠคํŠธ๋„ ํ†ต๊ณผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ์ด ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋กœ์ปฌ ์บ์‹œ์—์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ณ€ํ˜•์„ API๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ์–ด๋–ค ํ˜•ํƒœ์˜ ๋™์‹œ์„ฑ ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฑฑ์ •์€ ์‚ฌ์šฉ์ž A(์˜คํ”„๋ผ์ธ)๊ฐ€ ํ…Œ์ด๋ธ” X๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ˜๋ฉด ์‚ฌ์šฉ์ž B(์˜จ๋ผ์ธ)๋Š” ์‚ฌ์šฉ์ž A๊ฐ€ ์˜คํ”„๋ผ์ธ์ธ ๋™์•ˆ ํ…Œ์ด๋ธ” X๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๋™์‹œ์„ฑ ๊ทœ์น™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ ์งœ ๊ธฐ๋ฐ˜์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž A๊ฐ€ ์‚ฌ์šฉ์ž B๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž B์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

Apollo Client 2๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์€ ์ ˆ๋Œ€์ ์ธ ๊ฐœ ๋ฉ์–ด๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ์—ด๋ ฌํ•œ ํŒฌ์ด๊ธฐ๋„ ํ•˜๋‹ค. 1.0์˜ Redux ์Šคํ† ์–ด๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋‹ค์–‘ํ•œ ์‹œ๋„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ Apollo 2.0 ์ƒํƒœ๊ณ„์˜ ์™„์ „ํ•œ ์‹œ๋ฏผ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋†€๋ผ์šด ์ผ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฃฌ ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด์šฉ์€ ์ด๋ฏธ ๋‚˜์—๊ฒŒ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์œ ์ง€ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ทธ๊ณณ์—์„œ Apollo๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ, ๋Œ์—ฐ๋ณ€์ด๋ฅผ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋„ ์ด๊ฒƒ์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•œ๋‹ค. @danieljvdm apollo-client repo ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง€์†์„ฑ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์šฐ์œ„๋ฅผ ์ ํ–ˆ์Šต๋‹ˆ๋‹ค .

๋‚˜๋Š” RetryLink ๊ฐ€ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋ฐ ์žฌ์‹œ๋„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ redux-offline๊ณผ ๊ฐ™์€ ์ผ์ข…์˜

์ด๊ฒƒ์€ ๊ฝค ๋ฉ‹์ง€๋‹ค. @2WheelCoder๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋Š” ์™„์ „ํ•œ ์˜คํ”„๋ผ์ธ ์ง€์›(์ฟผ๋ฆฌ ๋Œ€๊ธฐ/๋ณ€์ด ๋“ฑ)๋ณด๋‹ค ์บ์‹œ๋ฅผ โ€‹โ€‹์œ ์ง€ํ•˜๋Š” ๋ฐ ๋” ์ค‘์ ์„

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ์œ„์— ๊ตฌ์ถ•ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์žฅ์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ์—์„œ ๋‚ด๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์€ ํ˜„์žฌ ์บ์‹œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์˜ค๋Š˜ ์ผ์ฐ @2WheelCoder ์˜ ์ดˆ๊ธฐ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. "์ €์žฅ์†Œ ๋ณ€๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง"์„ ์œ„ํ•œ ApolloLink ์ƒ์„ฑ์˜ ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ ์ž‘์—…๊ณผ ํ›„์† ์บ์‹œ ์“ฐ๊ธฐ ์‚ฌ์ด์˜ ์ปจํ…์ŠคํŠธ์—๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์ด ๋‚˜๊ฐ€๊ธฐ ์ „์— ๊ฐ€๋กœ์ฑ„๊ณ (๋ฏธ๋“ค์›จ์–ด) ์บ์‹œ์— ๊ธฐ๋ก๋˜๊ธฐ ์ „์— ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์• ํ”„ํ„ฐ์›จ์–ด). ํ•˜์ง€๋งŒ ์–ธ์ œ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ).

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

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ง€๊ธˆ ์žˆ๋Š” ๊ณณ์ด๊ณ  ๊ฝค ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€๋ ค๋ฉด apollo-cache-inmemory์— ๋Œ€ํ•œ PR์„ ์—ด์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@danieljvdm ์ €๋Š” ๊ฐ™์€ ์œ„์น˜์— ์žˆ์œผ๋ฉฐ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„ ์บ์‹œ์—์„œ ์ง์ ‘ ์ง€์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. HttpLink๋Š” ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด ์š”์ฒญ ํ›„์— ์™„๋ฃŒ๋˜์ง€๋งŒ (์ผ๋ฐ˜์ ์œผ๋กœ) ์บ์‹œ ์—…๋ฐ์ดํŠธ ์ „์— ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

apollo-cache-inmemory์— ๋Œ€ํ•œ PR์„ ์—ฌ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ํ”„๋กœ์ ํŠธ์— ์ด๋ฅผ ํฌํฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ์™€ ๋งํฌ์— ๋Œ€ํ•œ Apollo 2์˜ ๋ชจ๋“ˆ์„ฑ์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์บ์‹œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ apollo-client์˜ ๋ฌธ์ œ๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค(apollo-cache-inmemory์—๋Š” ์ž์ฒด ์ €์žฅ์†Œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)?

์—ฌ๊ธฐ ๋งํฌ์—์„œ ์ฃผ์ œ๋ฅผ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚˜์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@holman ์‚ฌํŒŒ๋ฆฌ ํ…Œํฌ ํ”„๋ฆฌ๋ทฐ์—์„œ ์„œ๋น„์Šค ์›Œ์ปค์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@sedubois ๊ทธ๊ฒƒ์€ ํ•œ ๋‘ ๋‹ฌ ์ „์— (๊ฐ‘์ž๊ธฐ) ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ ์— ์žˆ์ง€๋งŒ ์•„์ง ๊ฐˆ ๊ธธ์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

@2WheelCoder ์ƒˆ ์บ์‹œ์— ๋Œ€ํ•œ ์•„ํด๋กœ ํด๋ผ์ด์–ธํŠธ์˜ PR ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— apollo-offline-cache ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” apollo-cache-inmemory ? ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

@2WheelCoder @danieljvdm ์ง€์†์„ฑ์„ ์œ„ํ•ด LocalForage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป ์Šต๋‹ˆ๊นŒ https://github.com/localForage/localForage ์—ฌ๋Ÿฌ๋ถ„์ด PR์„ ์—ด๋ฉด ๊ธฐ๊บผ์ด ์†์„ ๋นŒ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

@danieljvdm ์˜ˆ, PR์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด์Šˆ๋ฅผ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ ์ฃผ ๋ฐ˜ ๋™์•ˆ ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์ง€๋งŒ ๊ทธ ์ดํ›„์— ๋›ฐ์–ด๋“ค๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@Eishpirate ํ™•์‹คํžˆ LocalForage๊ฐ€ ํ›Œ๋ฅญ apollo-offline-cache ์—์„œ ๋”ฐ๋ผ์•ผ ํ•  ์ ์ ˆํ•œ ํŒจํ„ด์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” redux ์ง€์† ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ AsyncStorage์— ์ €์žฅ์†Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ค ์•„์ด๋””์–ด๋ผ๋„?

@Eishpirate : localforage๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘์— ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ˜ธํ™˜์„ฑ ์ฐจํŠธ๋ฅผ ๋ณด๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. https://github.com/localForage/localForage/wiki/Supported-Browsers-Platforms

ํด๋กœ์˜ ์˜คํ”„๋ผ์ธ ๊ธฐ๋Šฅ์ด ์•ฑ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋งค์šฐ ์Šฌํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค..

@timLoewel ์•„์ฃผ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. React Native๋งŒํผ ์•ž์„œ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ฏฟ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด๋กœ ์ธํ•ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๊ณ ๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ๊ณผ ๊ด€๋ จ๋  ์ˆ˜ ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ธฐ์‚ฌ https://blog.logrocket.com/building-an-offline-first-app-with-react-and-rxdb-e97a1fa64356?t=now

rxdb๋ฅผ ์˜คํ”„๋ผ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ React, React-Native, Vue, Angular, ๊ฑฐ์˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์˜ต์…˜๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๋ฌธ์ œ๋Š” PouchDB(CouchDB์—์„œ ํŒŒ์ƒ๋จ)์™€ ๊ฐ™์€ noSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๊ด€๊ณ„ํ˜• SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Postgres)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด jsonschema๋ฅผ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DRY ์›์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉฐ ํ™•์‹คํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ Postgres์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” Kinto http://docs.kinto-storage.org/en/stable/index.html ์ด๋ฏ€๋กœ rxdb๊ฐ€ ๋„์ž…ํ•  ์ถ”๊ฐ€ ๋ณต์žก์„ฑ ๊ณ„์ธต์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Kinto๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๋ก ์ ์œผ๋กœ Apollo-link-http https://github.com/apollographql/apollo-link/tree/master/packages/apollo-link-http์— ์—ฐ๊ฒฐํ•  ์ˆ˜

๋งŽ์€ ์ž‘์—…์ด ์บ์‹ฑ๊ณผ ๊ด€๋ จ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋•์Šค๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (๋‚˜๋Š” ์ง„์ง€ํ•˜๋‹ค)

apollo-offline ์ž‘์—…๊ณผ apollo-link-offline ํŒจํ‚ค์ง€...
apollo-cache-redux ํŒจํ‚ค์ง€. apollo-offline์ด ์ง€๊ธˆ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ redux-offline/redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Apollo๋Š” ๊ธฐ๋ณธ ์ผ๋ฐ˜ ์†”๋ฃจ์…˜์œผ๋กœ inmemory-cache๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ทธ๋ ‡๊ฒŒ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ redux/redux-offline/redux-persis ์†”๋ฃจ์…˜์€ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์œผ๋ฉฐ... ์—ฌ์ „ํžˆ ํ›Œ๋ฅญํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์€ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋งค์šฐ ํ™œ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: @rportugal ๋•๋ถ„์— apollo-cache-redux ๊ฐ€ ์ด์ œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

@giautm ์ €๋Š” ๋‹น์‹ ์ด ์–ผ๋งˆ ์ „์— ์ œ ์ž‘์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ ๊ฒƒ์„ ๊ฑฐ์˜ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ์ด๋ฅผ ์ •๋ง ๊ฐ„๋‹จํ•œ ํŒจํ‚ค์ง€์ธ apollo-link-queue ๋กœ ๊ฒŒ์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์„ ์„ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์ œ์•ˆ์ด๋‚˜ ๊ธฐ์—ฌ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์ƒํƒœ๊ฐ€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? Apollo์—์„œ Redux ์˜คํ”„๋ผ์ธ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ์˜คํ”„๋ผ์ธ ํ•ญ๋ชฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@smithaitufe ,
์˜ˆ, apollo-cache-persist๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@๊ทธ๋ ˆ๊ณ ๋ฅด1971
์ด ์ฐธ์กฐ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋‚ด ์˜๊ฒฌ์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ์‹œ์›ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํด๋กœ ๋งํฌ ํ ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” apollo-offline ๊ณผ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ํ•˜๋Š” react-native์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
(ํ•‘ https://github.com/Malpaux/apollo-offline/issues/14)

์ด ์š”์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/lachenmayer/2e364a5ca9ae0918eb032867d0c6720d

๋‹ค์Œ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

์žฅ์น˜๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์š”์ฒญ์ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜๊ณ  ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋Œ€๊ธฐ์—ด์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ( apollo-link-queue )

๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ์žฌ์‹œ๋„๋ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ฌดํ•œ). ( apollo-link-retry )
์ด๊ฒƒ์€ ์žฅ์น˜๊ฐ€ ์˜คํ”„๋ผ์ธ์ด๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋‹ค์šด๋œ ๊ฒฝ์šฐ).

๊ทธ๋Ÿฌ๋‚˜ ์บ์‹œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ optimisticFetchLink ํ•จ์ˆ˜์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ด "๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ" ๋™์ž‘์€ apollo-offline์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ํ–ฅํ›„ apollo-link-offline ๊ตฌํ˜„์€ ์ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์œ ์ง€ํ•˜๋Š” ํ•œ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ํ‰์†Œ์™€ ๊ฐ™์ด ์•ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด network-and-cache ๊ฐ€์ ธ์˜ค๊ธฐ ์ •์ฑ…์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด์–ด์•ผ ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ๊ณง ๋ณ€๊ฒฝ๋  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(https://github.com/apollographql/react-apollo/issues/ ์ฐธ์กฐ). 604#issuecomment-355648596).

์š”์ง€ ๋ฅผ offlineLink.js ๋กœ ์ €์žฅ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { InMemoryCache } from 'apollo-cache-inmemory'
import { ApolloClient } from 'apollo-client'
import { createHttpLink } from 'apollo-link-http'

// get this from https://gist.github.com/lachenmayer/2e364a5ca9ae0918eb032867d0c6720d
import { createOfflineLink } from './offlineLink'

const cache = new InMemoryCache()
const networkLink = createHttpLink()

const offlineLink = createOfflineLink({ cache })

const link = ApolloLink.from([
  // ... + other links ...
  offlineLink,
  networkLink,
])

const client = new ApolloClient({
  cache,
  link,
}

์•Œ๋ ค์ง„ ๋ฌธ์ œ/๋น„ํŠธ ๋ˆ„๋ฝ

  • ์ด๊ฒƒ์€ ํ˜„์žฌ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๋ ค๋ฉด isOnline ์ฒดํฌ๋ฅผ ์ถ”์ƒํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์บ์‹œ์— ๋ถ€๋ถ„ ์‘๋‹ต๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์ด ๋ถˆ์™„์ „ํ•˜๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์–ด๋”˜๊ฐ€์—์„œ ๊ฑฐ๋ถ€๋œ ์•ฝ์†์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์‹ค์ œ๋กœ apollo-offline์ด ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์•„์ง ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์žฌ์‹œ๋„ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”๊ฐ€ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” pollo-offline์˜ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํฐ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ( {__online_: true} ์ฟผ๋ฆฌ ๋ณ€์ˆ˜ ์„ค์ •), ํ™•์‹คํžˆ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ํ…Œ์ŠคํŠธ๋„ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํƒ€์ดํ•‘, ํ…Œ์ŠคํŠธ, ๋ฌธ์„œ ๋ฐ ์ „์ฒด๊ฐ€ ํฌํ•จ๋œ ์ ์ ˆํ•œ npm ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์ œ ์ƒ๊ฐ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ, ์•„์ง apollo-client 2์— ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ์œ ๊ฐ์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ ธ์š”โœŒ๏ธ

@smithaitufe ,

์ด๊ฒƒ์€ apollo-link-queue์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๊นŒ?

apollo-link-queue๊ฐ€ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€๋Šฅ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. apollo-cache-persist๋Š” ์บ์‹œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ์ƒํƒœ์—์„œ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ์•ฑ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์œ„์˜ @lachenmayer ์˜ ์†”๋ฃจ์…˜(apollo-link-queue ์‚ฌ์šฉ)๊ณผ ์˜๊ตฌ์ ์ธ ์บ์‹œ ๋‘˜ ๋‹ค ๋˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ๋งํฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ฑ„ํŒ… ์ค‘์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.)

@lachenmayer ์ฒซ์ธ์ƒ ๋ถ€ํ„ฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

apollo-offline ์˜ ๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ(๋˜๋Š” ๊ทธ๊ฒƒ์˜ ๋ถ€์กฑ)์€ ์ฃผ๋กœ ๋‚ด๊ฐ€ apollo-offline ์„ ์‹œ์ž‘ํ•˜๋„๋ก ์˜๊ฐ์„ ์ค€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜ ์ž์‹ ์€ apollo-offline ์—์„œ ๋‚™๊ด€์  ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ์„ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ณ€์ˆ˜๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์•ž์œผ๋กœ ๋ช‡ ์ฃผ๊ฐ„์€ ๋‚˜์—๊ฒŒ ์ƒ๋‹นํ•œ ์ŠคํŠธ๋ ˆ์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ ํ›„์—๋Š” Apollo๋ฅผ ์œ„ํ•œ ์ตœ์‹  ์˜คํ”„๋ผ์ธ ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์˜ ๊ตฌํ˜„์— ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. apollo-offline ํŒจํ‚ค์ง€์˜ ์ƒˆ ๋ฒ„์ „์ด๊ฑฐ๋‚˜ apollo-link-offline ์™€ ๊ฐ™์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@MLPXBrachmann ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‚˜๋Š” ๋‚™๊ด€์  ํŽ˜์นญ์ด fetchPolicy ์‚ฌ์šฉํ•˜์—ฌ ์ œ์–ด๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ ค๋ฉด network-only ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@lachenmayer @MLPXBrachmann

์ €๋Š” ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ Apollo ์•ฑ์—์„œ ์˜คํ”„๋ผ์ธ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ์˜ต์…˜์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @lachenmayer ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งค์šฐ ์œ ๋ง ํด๋กœ ๋งํฌ ์žฌ์‹œ๋„์— ์˜์กดํ•˜๋ฏ€๋กœ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์ณ์ง€๋ฉด ์„œ๋ฒ„์— ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ํ๊ธฐ๋จ(์•ฑ์ด ์ผ์‹œ ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋„ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •). ๊ทธ ์ธก๋ฉด์— ๋Œ€ํ•œ ์ž‘์—…์ด๋‚˜ ์ตœ์†Œํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@nicocrm ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค ... ํ˜„์žฌ ์˜คํ”„๋ผ์ธ ์ง€์›์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ฃผ๋กœ ์ด ๋ฌธ์ œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„ํด๋กœ ์ž์ฒด๊ฐ€ ์ง€๊ธˆ ๋‹ค๋ฅธ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ apollo-link-offline ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ”๋ผ๊ฑด๋Œ€ ์ง€๊ธˆ๋ณด๋‹ค ๋” ๋งŽ์€ ํ† ๋ก ๊ณผ ๋ฐœ์ „์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜„

@benseitz ์ €๋Š” ํ™•์‹คํžˆ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์— ๋งŽ์€ ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋…ธ๋ ฅ์„ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฐํ™”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ƒˆ๋กœ์šด ํŒ€๊ณผ apollo-link-offline์„ ์œ„ํ•œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์ดˆ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ๊ฐœ์ธ์ ์œผ๋กœ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์ถ”์ง„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋“ค์ด ์ฃผ๋„๊ถŒ์„ ์žก๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด apollo-offline repo์— ๋ฌผ์–ด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๊ฐœ์ธ์ ์œผ๋กœ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @nicocrm์—์„œ ๋‹น์‹ ๊ณผ ๋” ๋งŽ์€ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ง€๊ธˆ๊นŒ์ง€ ์†์‹ค๋œ ์š”์ฒญ์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ tbh ๋‚˜๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ๊นŒ์ง€๋Š” ์ฟผ๋ฆฌ๋กœ๋งŒ & ๋ชจ๋“  ๊ฒƒ์„ ์ž˜ ์‹คํ–‰ํ•˜๋Š” _๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค_).

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด repo๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ apollo-offline ๋ฅผ ๊ตฌ์ถ•ํ•œ @MLPXBrachmann ์€ ์•ž์œผ๋กœ ๋ช‡ ์ฃผ ๋™์•ˆ apollo-offline ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ apollo-link-offline ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

apollo-offline ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ redux์—๋งŒ ํ•ด๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@nicocrm ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋งค์šฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ค‘์ธ ์ฟผ๋ฆฌ/๋ณ€์ด๋ฅผ ์ง€์†ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ž ์žฌ์ ์ธ apollo-link-offline ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@benseitz ์ €๋„ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ๋™์œผ๋กœ apollo-link-offline ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@lachenmayer ๋‹น์‹ ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. apollo-offline ์™€ ๊ณ„ํš๋œ apollo-link-offline ํŒจํ‚ค์ง€๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์€ ์•„๋งˆ ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Apollo 2.0 ์„ธ๊ณ„์—์„œ ์˜คํ”„๋ผ์ธ ํˆดํ‚ท ์„ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ „์ž์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์ด ์—ฌ์ „ํžˆ ์ ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  apollo-link-offline ๋Œ€ํ•œ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ๊ตฌํ˜„์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์ผ์ •์ด ์กฐ๊ธˆ ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ฝ”๋“œ๋„ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@MLPXBrachmann @lachenmayer @nicocrm ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
๋ˆ„๊ตฌ๋‚˜ Apollo Slack ์—์„œ ๊ณต๊ฐœ ์ฑ„๋„์„ ์—ด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. apollo-link-offline ๋ผ๋Š” ๊ฒƒ์„ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์‚ฌ์ด์˜ ์˜์‚ฌ ์†Œํ†ต์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ค‘์š”ํ•œ ๊ฒฐ์ •์€ ์—ฌ์ „ํžˆ โ€‹โ€‹GitHub ๋ฌธ์ œ์— ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

repo์™€ slack ์ฑ„๋„์„ ๋ชจ๋‘ ์—ด์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํžˆ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹น์‹ ์„ Repo์— ๊ณต๋™ ์ž‘์—…์ž๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Apollo Slack ์—์„œ #apollo-link-offline ์ฑ„๋„์— ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ GitHub Repo์—์„œ ํ˜‘์—…ํ•˜๊ณ  Slack์—์„œ ํ† ๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)
๋„ˆ๋ฌด ์‹ ๋‚ฌ์–ด์š” ๐Ÿ’ฏ

Google ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์—ฌ๊ธฐ๋กœ ์˜ค๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด Apollo Client 2.0์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ธฐ์กด ์˜คํ”„๋ผ์ธ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์š”์•ฝ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/benseitz/apollo-link-offline/issues/1#issuecomment -371678922

Apollo๋Š” AWS AppSync์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ GraphQL ์„œ๋ฒ„๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ AWS ์†”๋ฃจ์…˜(์˜ˆ: Lamda, DynamoDB, Elastic Search)์ด ์•„๋‹Œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ๋ฐ ๋ณ€ํ˜•์„ ์œ„ํ•œ ์˜คํ”„๋ผ์ธ ํด๋ผ์ด์–ธํŠธ ์บ์‹ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@masull ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹œ๋„ํ–ˆ์ง€๋งŒ Firebase ๋˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ํ”Œ๋žซํผ์ด ์ €์—๊ฒŒ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์˜๊ด‘์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋งŽ์€ ํŒจํ‚ค์ง€๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ์žฌ๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰