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,
},
},
});