๊ฐœ๋ฐœ/React

[๋ฆฌ์•กํŠธ] React-Query - 2. CacheTime , StaleTime (feat.ReactQueryDevtools)

๋ฐ(Ming) ๐Ÿˆ‍โฌ› 2023. 5. 9. 22:54
728x90
๋ฐ˜์‘ํ˜•

React-Query ์žฅ์  ์ค‘์˜ ํ•˜๋‚˜์˜€๋˜ ์บ์‹ฑ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. 

 

์บ์‹ฑ์„ ์ด์•ผ๊ธฐ ์ „์— ์•Œ์•„๋‘๋ฉด ์ข‹์„ tool์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๋ฐ”๋กœ ReactQueryDevtools ์ด๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ fetching ๋˜๊ณ  ๊ทธ ์ƒํƒœ๊ฐ’์ด๋ผ๋˜๊ฐ€ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” tool์ž…๋‹ˆ๋‹ค. react query ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. 

 

 

โ–ถ ReactQueryDevtools ์‚ฌ์šฉ๋ฒ• 

import { ReactQueryDevtools} from 'react-query/devtools';
//์ด๋ ‡๊ฒŒ import ํ•ฉ๋‹ˆ๋‹ค

function App() {
  return (
      <QueryClientProvider client={queryClient}>
    <Router>
        <Routes>
          <Route exact path="/super-heroes" element={<SuperHeroesPage/>} />
          <Route exact path="/rq-super-heroes" element={<RqSuperHeroesPage />} />
          <Route exact path="/" element={<HomePage />} />
        </Routes>
    </Router>
        <ReactQueryDevtools initialIsOpen={false} position='bottom-right' />
      </QueryClientProvider>
  );
}

์•„๋ž˜์™€ ๊ฐ™์ด ํ™”๋ฉด ํ•˜๋‹จ ์˜ค๋ฅธ์ชฝ์— ๋œฌ ๋ฒ„ํŠผ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์–ด์š”. ํด๋ฆญ์„ ํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋œน๋‹ˆ๋‹ค.

 

tools ์•ˆ์—์„œ fresh , fetching, stale, inactive ์™€ ๊ฐ™์ด Data Fetching Status๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์บ์‹ฑ์˜ ์ดํ•ด๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 
์˜ค๋ฅธ์ชฝ์—๋Š” Observer๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ ํ•ด๋‹น API call๋ฅผ ์š”์ฒญํ•˜๋Š” observer์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, Last Updated์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ query๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ์‹œ๊ฐ„์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Actions ๋ฒ„ํŠผ์€ query์™€ ๊ด€๋ จ๋œ action์„ ํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Query์˜ ์ƒํƒœ๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ devtools์—์„œ ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด data fetching ์ž‘์—…์„ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

CacheTime

data๊ฐ€ inactive ๋œ ์ƒํƒœ์ผ ๋•Œ ์บ์‹ฑ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๋Š” ์‹œ๊ฐ„์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. 

query instances๊ฐ€ mount ๋˜์—ˆ๋‹ค๊ฐ€ unmount ๋˜๋ฉด inactive ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ์ด ๋˜๊ณ  , ์บ์‹œ๋Š” cacheTime ๋งŒํผ ์œ ์ง€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์บ์‹œ๊ฐ€ ์œ ์ง€๋˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ์€ query instances๊ฐ€ ๋‹ค์‹œ mount ๋˜๋ฉด data๋ฅผ fetchํ•˜๋Š” ๋™์•ˆ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 

์ด ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋กœ ์‚ญ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์ด 5๋ถ„์ž…๋‹ˆ๋‹ค

 

 

StaleTime

data๊ฐ€ fresh ์ƒํƒœ์—์„œ stale์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค

fresh์ƒํƒœ์ผ๋•Œ๋Š” ํŽ˜์ด์ง€ ์ด๋™์ด ์žˆ์–ด๋„ ๋‹ค์‹œ fetch๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, query instances๊ฐ€ ์ƒˆ๋กญ๊ฒŒ mount๋˜์–ด๋„ ๋„คํŠธ์›Œํฌ fetch๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

data๊ฐ€ ํ•œ๋ฒˆ fetch๋˜๊ณ  ๋‚˜๋ฉด staleTime์ด ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด unmountํ›„ mount ๋˜์–ด๋„ fetch๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

๊ธฐ๋ณธ ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋”ฐ๋กœ staleTime์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ReactQuery์˜ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

์•„๋ž˜์™€ ๊ฐ™์ด cacheTime, staleTime ์„ ์„ค์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

useQuery ์•ˆ์—์„œ ์„ค์ •ํ•ด์ฃผ์‹œ๋ฉด ๋œ๋‹ต๋‹ˆ๋‹ค. ๋ฌผ๋ก  queryClient์—์„œ๋„ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export const RqSuperHeroesPage = (props) => {
    const {isLoading, data, isError, error } = useQuery('super-heroes', fetchSuperHeroes,
    {
    cacheTime: 500,
    staleTime: 3000,
    })

    if(isLoading){
        return <h2>LOading....</h2>
    }

    if(isError){
        return <h2>{error.message}</h2>
    }

    return (
        <>
            <h2>RQ Super Heroes Page</h2>
            {data?.data.map(hero => {
                return <div>{hero.name}</div>
            })}
        </>
    )

 

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      // 20 second
      staleTime: 20000,
    },
  },
});

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90