๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Front
Tanstack Query
11-Network Mode

Network Mode

TanStack Query๋Š” ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ์—†๋Š” ๊ฒฝ์šฐ query์™€ mutation์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด 3๊ฐ€์ง€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ๋Š” query/Mutation๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , query/mutation ๊ธฐ๋ณธ๊ฐ’์„ ํ†ตํ•ด ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

TanStack Query๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetching) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฒฐํ•ฉ๋œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetching )์— ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ๋Š” ์˜จ๋ผ์ธ์ž…๋‹ˆ๋‹ค.


1. Network Mode: online

์ด ๋ชจ๋“œ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด query/mutation๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. online ๋ชจ๋“œ๊ฐ€ ๊ธฐ๋ณธ ๋ชจ๋“œ์ด๋‹ค. ๋งŒ์•ฝ query์— ๋Œ€ํ•ด fetch๊ฐ€ ์‹œ์ž‘๋˜๋ฉด, (๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—) fetch๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ•ญ์ƒ ์ƒํƒœ(pending, error, success)๋กœ ๋จธ๋ฌด๋ฅธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ fetchStatus๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋ฉด, ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • fetching : queryFn์ด ์‹ค์ œ๋กœ ์‹คํ–‰ ์ค‘์ด๋‹ค. - ์š”์ฒญ์ด ๋Œ€๊ธฐ ์ค‘(in-flight)
  • paused : query๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. - ๋‹ค์‹œ ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ผ์‹œ ์ค‘์ง€
  • idle : query๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ , ์ผ์‹œ ์ค‘์ง€๋˜์ง€๋„ ์•Š์Œ

isFetching๊ณผ isPaused ํ”Œ๋ž˜๊ทธ๋“ค์€ ์ด ์ƒํƒœ์—์„œ ํŒŒ์ƒ๋˜์–ด, ํŽธ์˜์ƒ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด pending ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•ด๋ผ. query๋Š” state: 'pending' ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, fetchStatus: 'paused'์ผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฒ˜์Œ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ์—†๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์˜จ๋ผ์ธ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— query๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ, fetch๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๋™์•ˆ์— ์˜คํ”„๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, TanStack Query๋„ ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ผ์‹œ ์ค‘์ง€ํ•œ๋‹ค. ์ผ์‹œ ์ค‘์ง€๋œ query๋Š” ๋„คํŠธ์›Œํฌ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ๊ทธ ์ดํ›„๋ถ€ํ„ฐ ์ด์–ด์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” refetchOnReconnect(์ด ๋ชจ๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ true์ด๊ธฐ๋„ ํ•จ)์™€๋Š” ๋ฌด๊ด€ํ•˜๋ฉฐ,
์ด๋Š” refetch๊ฐ€ ์•„๋‹ˆ๋ผ continue์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์ด์— query๊ฐ€ ์ทจ์†Œ๋˜์—ˆ๋‹ค๋ฉด, ๊ณ„์†ํ•˜์ง€ fetchํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


2. Network Mode: always

์ด ๋ชจ๋“œ์—์„œ TanStack Query๋Š” ํ•ญ์ƒ fetchgkau, ์˜จ๋ผ์ธ/์˜คํ”„๋ผ์ธ ์ƒํƒœ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค. ์ด ๋ชจ๋“œ๋Š” () ์„ ํƒํ•˜๋ ค๋Š” ๋ชจ๋“œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. (TanStack Query๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด,) (query๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ™˜๊ฒฝ์—์„œ,) e.g., AsyncStorage๋ฅผ ์ฝ๊ฑฐ๋‚˜, queryFn์—์„œ Promise.resolve(5)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

  • Queries๋Š” paused๋˜์ง€ ์•Š๋Š”๋‹ค (๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—)
  • ์žฌ์‹œ๋„๋„ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - query๊ฐ€ ์‹คํŒจํ•˜๋ฉด, error ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์ด ๋ชจ๋“œ์—์„œ refetchOnReconnect๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ false๋กœ ์„ค์ •๋œ๋‹ค.
    • ์™œ๋ƒํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์žฌ์—ฐ๊ฒฐ์€ ๋” ์ด์ƒ ์˜ค๋ž˜๋œ(stale) query๋ฅผ refetchํ•˜๋Š” ๊ฑด ์ข‹์€ ์ง€ํ‘œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์›ํ•œ๋‹ค๋ฉด ์ด๋ฅผ ์ผœ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

3. Network Mode: offlineFirst

์ด ๋ชจ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋‘ ์˜ต์…˜ ์‚ฌ์ด์˜ ์ ˆ์ถฉ์•ˆ์œผ๋กœ,
TanStack Query๋Š” queryFn์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ํ›„์— ์žฌ์‹œ๋„๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ชจ๋“œ๋Š” ์˜คํ”„๋ผ์ธ ์šฐ์„  PWA์—์„œ์™€ ๊ฐ™์ด ์บ์‹ฑ์„ ์œ„ํ•ด ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๋Š” serviceWorker๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋‚˜
Cache-Control ํ—ค๋”๋ฅผ ํ†ตํ•ด HTTP ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


4. Devtools

TanStack Query Devtools๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜์ง€๋งŒ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฅผ ์ผ์‹œ ์ค‘์ง€๋œ ์ƒํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜คํ”„๋ผ์ธ ๋™์ž‘์„ ๋ชจ์˜ํ•˜๋Š” ํ† ๊ธ€ ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„ํŠผ์€ ์‹ค์ œ๋กœ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ๋ฐฉํ•ดํ•˜์ง€๋Š” ์•Š์ง€๋งŒ(์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ๋„๊ตฌ์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค), OnlineManager๋ฅผ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


4. Signature(ํŠน์ง•, ๋Œ€ํ‘œ)

networkMode: 'online' | 'always' | 'offlineFirst'

  • optional(์˜ต์…˜)
  • defaults to โ€˜onlineโ€™