Skip to content

Latest commit

ย 

History

History
159 lines (106 loc) ยท 11.3 KB

File metadata and controls

159 lines (106 loc) ยท 11.3 KB

๐Ÿ’ป Inside React Query

  • ํ•ด๋‹น ๋ฌธ์„œ๋Š” tkdodo - inside-react-query ํฌ์ŠคํŒ…์„ ๋ฒˆ์—ญํ•˜๊ณ , ์ข€ ๋” ์ดํ•ด์— ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

Intro

  • React Query๋Š” ๋ฆฌ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ์‹œ์ ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋˜ ์–ด๋–ป๊ฒŒ ์ค‘๋ณต ์š”์ฒญ์„ ์ œ๊ฑฐํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?
  • ์œ„ ์งˆ๋ฌธ๋“ค์— ๋‹ตํ•˜๋ ค๋ฉด React Query์˜ ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ณ , useQuery๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ถ„์„ํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

QueryClient

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 1 41 04
  • ๋ชจ๋“  ๊ฒƒ์€ QueryClient์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • QueryClient๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , QueryClientProvider๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";

// โฌ‡๏ธ this creates the client
const queryClient = new QueryClient();

function App() {
  return (
    // โฌ‡๏ธ this distributes the client
    <QueryClientProvider client={queryClient}>
      <RestOfYourApp />
    </QueryClientProvider>
  );
}

  • QueryClientProvider๋Š” React Context๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— QueryClient๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • new QueryClient()๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋Š” ์•ˆ์ •์ ์ธ ๊ฐ’์ด๋ฉฐ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, React Context๋กœ ์ „๋‹ฌํ•˜๊ธฐ์— ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
    • Context๊ฐ€ ์•ฑ์„ ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ง€ useQueryClient๋ฅผ ํ†ตํ•ด queryClient์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋งŒ queryClient ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹ค์ˆ˜๋กœ ์ž์ฃผ ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

A vessel that holds the cache (์บ์‹œ๋ฅผ ๋‹ด๋Š” ๊ทธ๋ฆ‡)

  • ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, QueryClient ์ž์ฒด๋Š” ์‹ค์ œ๋กœ ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • QueryClient๋Š” new QueryClient()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๋Š” QueryCache์™€ MutationCache๋ฅผ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  query์™€ mutation์— ์ ์šฉํ•  ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, cache(์บ์‹œ)๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ๋Š” cache์™€ ์ง์ ‘ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š๊ณ  QueryClient๋ฅผ ํ†ตํ•ด cache์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

QueryCache

  • QueryClient๋Š” ์šฐ๋ฆฌ๊ฐ€ cache๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด cache(QueryCache)๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 1 53 07
  • ๊ฐ„๋‹จํžˆ ๋งํ•ด QueryCache๋Š” in-memory ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. key๋Š” ์•ˆ์ •์ ์œผ๋กœ ์ง๋ ฌํ™”๋œ queryKey(queryKeyHash๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค)์ด๊ณ , value๋Š” Query ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
  • React Query๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ in-memory์—๋งŒ ์ €์žฅํ•˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 05 50

ํ•ด์„: ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋ฉฐ, ํ•ด๋‹น ํƒญ์˜ JavaScript ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ์—๋งŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ๊ณ ์นจ, ํ•˜๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜(pushState๋‚˜ replaceState ํžˆ์Šคํ† ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋™), ํƒญ์„ ๋‹ซ๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์—ฌ๋Š” ๊ฒฝ์šฐ์—๋Š” ์บ์‹œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • TanStack/query#1677 (comment)
  • cache๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ์ด์Šˆ์—์„œ React Query์˜ ์ฐฝ์‹œ์ž tannerlinsley๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.
  • tannerlinsley๋Š” React Query์˜ cache๊ฐ€ in-memory ๊ฐ์ฒด์ด๋ฉฐ, ๋ธŒ๋ผ์šฐ์ € ํƒญ์˜ JavaScript Context(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ) ์ƒ๋ช… ์ฃผ๊ธฐ ๋‚ด์—์„œ๋งŒ ์กด์žฌํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, React Query ์บ์‹œ๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ ๊ฐ„์— ๊ณต์œ ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์บ์‹œ๋ฅผ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด persisters๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

in-memory?

  • ์œ„์—์„œ ๋งํ•˜๋Š” in-memory๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋Š” ๋Œ€์ฒด๋กœ ํƒญ์„ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ ํƒญ์€ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ๊ฐ ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ๋œ JavaScript ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ํ•œ ํƒญ์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜, ๊ฐ์ฒด ๋“ฑ์€ ๋‹ค๋ฅธ ํƒญ๊ณผ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Query

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 28 43
  • QueryCache์—๋Š” Query๋“ค์ด ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์€ ์ด Query์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Query๋Š” ๋ฐ์ดํ„ฐ, ์ƒํƒœ ํ•„๋“œ, ๋งˆ์ง€๋ง‰ fetching์ด ๋ฐœ์ƒํ•œ ์‹œ์ ๊ณผ ๊ฐ™์€ meta ์ •๋ณด ๋“ฑ query์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, query ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žฌ์‹œ๋„, ์ทจ์†Œ, ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง๊นŒ์ง€ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • Query์—๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ๋จธ์‹ ์ด ์žˆ์–ด์„œ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์— ๋น ์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ fetching์ด ์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ query ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ํ•ด๋‹น ์š”์ฒญ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • query๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ ํฌ์ธํŠธ๋Š” query๊ฐ€ ๋ˆ„๊ฐ€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ๊ด€์ฐฐ์ž(Observer)๋“ค์—๊ฒŒ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

QueryObserver

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 43 35
  • Observer๋Š” query์™€ query๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ ‘์ฐฉ์ œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Observer๋Š” useQuery๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ์„ฑ๋˜๋ฉฐ, ํ•ญ์ƒ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ query๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” useQuery์— queryKey๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Observer๋Š” ์กฐ๊ธˆ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
  • Observer๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ query์˜ ์†์„ฑ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ด€๋ จ ์—†๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์•Œ๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ data ํ•„๋“œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด background refetch๋กœ isFetching์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์™€๋Š” ๊ด€๋ จ ์—†๋Š” ์†์„ฑ์ด๋ฏ€๋กœ ๊ตณ์ด ๋ฆฌ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋” ๋‚˜์•„๊ฐ€ ๊ฐ Observer๋Š” select ์˜ต์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—์„œ data ํ•„๋“œ์˜ ์–ด๋–ค ๋ถ€๋ถ„์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • staleTime ๋˜๋Š” interval fetching๊ณผ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ํƒ€์ด๋จธ๋„ Observer Level์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Active and inactive Queries (ํ™œ์„ฑ ๋ฐ ๋น„ํ™œ์„ฑ ์ฟผ๋ฆฌ)

  • Observer๊ฐ€ ์—†๋Š” query๋ฅผ inactive(๋น„ํ™œ์„ฑ) query๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • inactive query๋Š” ์—ฌ์ „ํžˆ ์บ์‹œ์— ๋‚จ์•„ ์žˆ์ง€๋งŒ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ inactive query๋Š” React Query Devtools์—์„œ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ์™ผ์ชฝ์˜ ์ˆซ์ž๋Š” ํ•ด๋‹น query๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” Observer์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 58 00

The Complete Picture of React Query Architecture (๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ์ „์ฒด ๊ทธ๋ฆผ)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 59 50
  • ์œ„ ๊ทธ๋ฆผ์„ ์ข…ํ•ฉํ•ด๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์ด ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” Query Core ์•ˆ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • QueryClient, QueryCache, Query, QueryObserver๊ฐ€ ๋ชจ๋‘ Query Core์— ์†ํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ์šฉ Adapter(์–ด๋Œ‘ํ„ฐ)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ Observer๋ฅผ ๋งŒ๋“ค๊ณ , Observer๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , Observer๊ฐ€ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • react์™€ solid์šฉ useQuery Adapter์—๋Š” ๊ฐ๊ฐ ์•ฝ 100์ค„์˜ ์ฝ”๋“œ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

Adapter(์–ด๋Œ‘ํ„ฐ)?

  • Adapter๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์‹œ์Šคํ…œ์ด๋‚˜ ์žฅ์น˜, ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์žฅ์น˜ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

From a component perspective (์ปดํฌ๋„ŒํŠธ ๊ด€์ ์—์„œ)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-02-27 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 3 13 58
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ํ๋ฆ„์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๋ฉด useQuery๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Observer๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ๋œ Observer๋Š” QueryCache์— ์žˆ๋Š” Query๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ตฌ๋…์€ Query๊ฐ€ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด Query ์ƒ์„ฑ์„, ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉด background refetch๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • fetching์ด ์‹œ์ž‘๋˜๋ฉด Query์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— Observer์—๊ฒŒ ์ด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋ฉด Observer๋Š” ๋ช‡ ๊ฐ€์ง€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์•Œ๋ ค ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • Query ์‹คํ–‰์ด ๋๋‚˜๋ฉด Observer์—๊ฒŒ ์ด ์‚ฌ์‹ค์„ ๋‹ค์‹œ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์œ„ ๋‚ด์šฉ์€ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ๋ฆ„ ์ค‘ ํ•˜๋‚˜์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ cache์— ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • tkdodo - #17: Seeding the Query Cache ํ•ด๋‹น ํฌ์ŠคํŒ…์—์„œ ๊ด€๋ จ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํ๋ฆ„์—์„œ ๊ณตํ†ต์ ์ธ ์ ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์ด React(๋˜๋Š” Vue, Solid) ์™ธ๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๊ณ , ์ƒํƒœ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋Š” Observer์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉฐ, Observer๊ฐ€ ์ปดํฌ๋„ŒํŠธ์—๋„ ์•Œ๋ ค์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.