React Query - Re-fetching

๋ฐ•์ •ํ˜ธยท2023๋…„ 1์›” 15์ผ
1

React Query

๋ชฉ๋ก ๋ณด๊ธฐ
9/14
post-thumbnail

๐Ÿš€ Start

refetching์„ ํ• ๋•Œ ์—ผ๋‘ํ•ด์•ผํ•  ์ ์€ ์„œ๋ฒ„๊ฐ€ ๋งŒ๋ฃŒ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ฆ‰, ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊ฐœ๋ฐœ์ž์˜ ์˜์ง€์™€ ์ƒ๊ด€์—†์ด ์„œ๋ฒ„๊ฐ€ ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋ฆฌํŒจ์นญ ํŽ˜์ด์ง€๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™€์•ผ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ณด์•˜์„ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ์ด๋•Œ staleTime์„ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€์•Š๋Š” ์ด์ƒ 0์ดˆ๋กœ ์„ค์ •๋˜์–ด์žˆ๊ณ  ๊ทธ ๋œป์€ ๊ณ„์†ํ•ด์„œ ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋ผ๋Š” ๊ฒƒ์ด๊ณ  ๊ณ„์†ํ•ด์„œ refetching๋˜์–ด ์—…๋ฐ์ดํŠธ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฆฌํŒจ์นญ์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋“ค์–ด์˜ค๋Š” ๋“ฑ์˜ ๋™์ž‘์ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ refetching์€ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์˜ต์…˜์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.



โญ๏ธ Refetching

โœ… refetcing์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ต์…˜์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ „์—ญ์ด๋  ์ˆ˜๋„ ์žˆ๊ณ , ํ˜ธ์ถœ ์ฟผ๋ฆฌ ์‚ฌ์šฉ์— ํŠน์ •๋œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.(์ฐธ๊ณ )

  • refetchOnMount
  • refetchOnWindowFocus
  • refetchOnReconnect
  • refetchInterval

โœ… refetching์„ ์ง์ ‘ ๋ช…๋ นํ•  ์ˆ˜๋„ ์žˆ๋‹ค!

์˜ต์…˜์œผ๋กœ ์ •ํ•ด์ ธ๋†“์€ ๋•Œ๊ฐ€ ์•„๋‹Œ, ์›ํ•˜๋Š” ๋•Œ์— ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ๋Š” useQuery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ refetch ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚ค๋ฉด ๋œ๋‹ค.

  • ueryClient.invalidateQueries()

    • ๊ณ ์˜๋กœ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”๋ฅผ ํ–ˆ์„ ๋•Œ refetch (์ฐธ๊ณ )
    • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ๊ณ ์˜๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™”์‹œํ‚ค๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ stale ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋จ๊ณผ ๋™์‹œ์— refetch ์‹คํ–‰
  • refetch()

    • ๋ช…์‹œ์ ์œผ๋กœ refetch ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ(์ฐธ๊ณ )

โœ… refetching์„ ์ œํ•œํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š”?

refetching์„ ์ œํ•œํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” stale time์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ๋˜๋Š”๋ฐ, ์ฐฝ์„ ์žฌํฌ์ปค์Šคํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ์— ์žฌ์—ฐ๊ฒฐํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋งŒ๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, stale time์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๋งŒ๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ง€์—ฐ๋ ํ…Œ๋‹ˆ๊นŒ.

๋˜๋Š” ์•ž์„œ ๋ณธ ์˜ต์…˜์ค‘์— ํ•˜๋‚˜ ๋˜๋Š” ์ „์ฒด๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ refetcing์„ ์ œํ•œํ•  ๋•Œ๋Š” ์‹ ์ค‘ํ•ด์•ผํ•œ๋‹ค. ๋ณ€๋™์ด ์žฆ์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ์ ์šฉํ•ด์•ผํ•˜๋ฉฐ ๋ฏธ์„ธํ•œ ๋ณ€๊ฒฝ์—๋„ ํฐ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ์ ์šฉํ•˜๋ฉด ์•ˆ๋  ๊ฒƒ์ด๋‹ค.


โœ… refetching์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€...

์ƒ๊ฐํ•ด๋ณด๋ฉด refetching์„ ํ•˜๋ฉด ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์„œ ์ตœ์‹ ํ™”๋œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์ด ๋นˆ๋ฒˆํ•  ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, React Query๊ฐœ๋ฐœ์ž ์™ˆ.

'๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•ญ์ƒ ์‹ค์‹œ๊ฐ„์ผ ์ˆ˜ ์žˆ๋‚˜์š”?'๊ฐ€ '์™œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋˜๋‚˜์š”?'๋ณด๋‹ค๋Š” ํ›จ์”ฌ~ ๋‚ซ๋‹ค.

๋งž๋Š”๋“ฏ ๐Ÿ˜…



๐Ÿ‘‰ refetching ์ œํ•œ/์„ค์ •

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด refetcing์„ ์ œํ•œํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‹ ์ค‘ํ•ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ฆ‰, ์‚ฌ์šฉ์ž์— ์˜ํ•ด์„œ๋„ ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ๋„ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ์ถœ๋ ฅ์‹œ์ผœ์ค„ ๋ฐ์ดํ„ฐ๋ผ๋ฉด ์—ฌ๋Ÿฌ ํŠธ๋ฆฌ๊ฑฐ๋งˆ๋‹ค refetcing๋  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก ํŠธ๋ฆฌ๊ฑฐ(Trigger) : ์–ด๋Š ํŠน์ •ํ•œ ๋™์ž‘์— ๋ฐ˜์‘ํ•ด ์ž๋™์œผ๋กœ ํ•„์š”ํ•œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋œป


staleTime์„ 60๋งŒ ๋ฐ€๋ฆฌ์ดˆ๋กœ ์„ค์ •ํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ 10๋ถ„๋™์•ˆ ์œ ์ง€๋˜๊ฒŒ ํ•˜์ž.

cacheTime์€ 5๋ถ„์ด ๊ธฐ๋ณธ๊ฐ’์ธ๋ฐ staleTime์ด cacheTime๋ณด๋‹ค ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ์€ ๋ง์ด ์•ˆ๋œ๋‹ค.

๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ์บ์‹ฑ์— ๋ฐฑ์—…๋œ ๋‚ด์šฉ์ด ๋ณด์—ฌ์งˆ ๊ฒƒ์ธ๋ฐ, ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ์บ์‹ฑ์ด ๋จผ์ € ๋งŒ๋ฃŒ๋œ๋‹ค๋Š” ๊ฒƒ์€ refetcing์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋™์•ˆ ๋ณด์—ฌ์ค„ ํ™”๋ฉด์ด ์—†๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ, cacheTime์€ 90๋งŒ ๋ฐ€๋ฆฌ์ดˆ๋กœ ์„ค์ •ํ•ด๋ณด์ž.

โœ… refetching ์ „์—ญ์„ค์ •

export const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      onError: queryErrorHandler,
      staleTime: 600000,
      cacheTime: 900000,
      refetchOnMount: false,
      refetchOnWindowFocus: false,
      refetchOnReconnect: false,
    },
  },
});


๐Ÿ‘‰ Override & Polling

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

๊ทธ๋ ‡๋‹ค๋ฉด, ์œ„์™€ ๊ฐ™์ด refetching์— ๋Œ€ํ•ด ์ œํ•œ๋œ ์ƒํƒœ์—์„œ refetching์ด ๊ผญ ์ด๋ฃจ์–ด์ ธ์•ผํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์ค˜์•ผํ• ๊นŒ?


โœ… Override

์ƒ์œ„์—์„œ ์„ค์ •ํ•œ ์˜ต์…˜์„ ํ•˜์œ„์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, refetching์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์—์„œ ๋ณ„๋„๋กœ ์„ค์ •์„ ๋˜ ํ•ด์ฃผ๋ฉด ๋~

const commonOptions = { staleTime: 0, cacheTime: 300000 };

...
 // prefetching ์ผ์–ด๋‚˜๋Š” ๋ถ€๋ถ„์— staleTime, cachTime ์„ค์ •
 useEffect(() => {
    	...
    queryClient.prefetchQuery(queryKey, queryFn, commonOptions);
  }, [...]);
      
 // ์ฟผ๋ฆฌ์ƒ์„ฑ ๋ถ€๋ถ„์—์„œ ์„ค์ •
 const { data } = useQuery(queryKey, queryFn,
    {
      ...commonOptions,
      refetchOnMount: true,
      refetchOnWindowFocus: true,
      refetchOnReconnect: true,
    },
  );

โœ… Polling

์œ„์—์„œ ์„ค์ •ํ•œ StaleTime, refetchOn.. ์˜ต์…˜๋“ค์„ 0์ดˆ๋กœ ์„ค์ •ํ•˜๊ณ , true๋กœ ์„ค์ •ํ•˜์˜€๋‹คํ•ด๋„ ๊ฒฐ๊ตญ ํ•ด๋‹น ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, refetchingInterval์„ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ์‹œ๊ฐ„๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

refetchingInterval ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ refetchingํ•ด๋ณด์ž.

(์ฐธ๊ณ )

 const { data } = useQuery(queryKey, queryFn,
    {
       ...
      refetchOnReconnect: true,
      refetchInterval: 60000, // 1๋ถ„๋งˆ๋‹ค
    },
  );
  • Test 1๏ธโƒฃ

    • refetchInterval์„ 10์ดˆ๋กœ ์„ค์ •ํ•˜์˜€์„ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ™”๋ฉด์— 10์ดˆํ›„์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

      ๐Ÿ‘‰ 1์ดˆ๋งˆ๋‹ค ํ™”๋ฉด์ด refetching๋˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ์‹œ ๋ฐ”๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ.

  • Test 2๏ธโƒฃ
    - refetchInterval์„ 1์ดˆ๋กœ ์„ค์ •ํ•˜์˜€์„ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ™”๋ฉด์— ๊ฑฐ์˜ ์ฆ‰์‹œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

    ๐Ÿ‘‰ 10์ดˆ๋งˆ๋‹ค ํ™”๋ฉด์ด refetching๋˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ์‹œ 10์ดˆ ํ›„ ํ™”๋ฉด์— ์ถœ๋ ฅ.


profile
๊ธฐ๋กํ•˜์—ฌ ๊ธฐ์–ตํ•˜๊ณ , ๊ณ„ํšํ•˜์—ฌ ์‹ค์ฒœํ•˜์ž. will be a FE developer (HOME๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Notion์œผ๋กœ ๋†€๋Ÿฌ์˜ค์„ธ์š”!)

0๊ฐœ์˜ ๋Œ“๊ธ€