์ด์ ํฌ์คํ ์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ ๊ฐ๋ฅ์ผ ํ๋ react router ์ค์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ค๋ค.
์ฑ ์ ์ฒด๋ฅผ ๊ฐ์ธ์ฃผ๊ธฐ ์ํด Provider๋ก ๊ฐ์ธ์คฌ์๋๋ฐ, ์ค๋์ ์ด ์ต์๋จ์ ๊ฐ์ธ์ค TanstackQuery ์ค์ ์ ํด์ฃผ์.
๐ฉ๐ป๐ป Tanstack query๊ฐ ๋ญ์ง, ์ ์ธ์ง, ์ค์ ํด ์ฃผ๋ ๋ฐฉ๋ฒ ๋ฑ์ ๋ํด ์ดํด๋ณด์.
Tanstack Query๋
์ด์ ๋ถํฐ (์ด์ tanstack query๋ก ๊ฐ๋ช ํ) reactquery๋ฅผ ์จ๋ดค์ง๋ง ์ฐ๋ ์ด์ ์ ๋ํด์๋ ์ ๋ฆฌ๋ฅผ ๋ฐ๋ก ํ์ง ์์๋ ๊ฒ ๊ฐ๋ค.
์ด์ ์๋ ๋ฐ๋ก axios๋ฅผ ์ฐ๊ฑฐ๋ fetch๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์์ง๋ง, ์ด์ ๋ tanstack query๋ฅผ ์ ์ฐ๋ ๊ฒ ์ด์ํ ๋๋์ด ๋ค ์ ๋๋ค.
์ด๋ฒ์๋ ์กฐ๊ธ ์๋ก์์ง tanstack query๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ณด๊ณ , ์ด๋ค ์ด์ ์์ ์์ด ๊ณ์ ๊ฐ๊ฒ ๋์๋์ง ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
Tanstack query์ ํฌ๊ฒ ๋ค์์ ๊ธฐ๋ฅ๋ค์ ์ง์ํ๋ data-fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
- fetching
- ์บ์ฑ
- ์๋ฒ ์ํ์ ์ฑํฌ ๋ง์ถ๊ณ ์ ๋ฐ์ดํธ
๋๋ถ๋ถ์ ์น ํ๋ ์์ํฌ๋ค์ fetchํ๋ ๋ฐฉ์ ๋๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋ฐฉ์์ด opinionated์ด๊ฑฐ๋ holistic(์ ๊ธฐ์ )์ด์ง ์๋ค.
๊ทธ๋์ ๊ฐ๋ฐ์๋ค์ data-fetching์ ๋ํ ์๊ฒฉํ ๊ธฐ์ค๋ค์ ๊ฐ์ถ meta-framework๋ค์ ์ง์ ๋ง๋ค๊ฑฐ๋, ์์ ๋ง์ data fetching ๋ฐฉ๋ฒ์ ๋ง๋ค์ด๋ด์ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ state๊ณผ side-effect์ด ๋ค์์ผ ์๊ฑฐ๋,
์ผ๋ฐ์ ์ธ state ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ณตํ๋ ๋ฐฉ์์ ํ์ฉํ๋ ๋ฐฉ์์ด ๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ์๋ ์ ํต์ ์ธ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํจ์จ์ ์ด์ง๋ง ๋น๋๊ธฐ(async)๋ ์๋ฒ ์ํ์ ๊ด๋ฆฌ์๋ ๋ถ์ ์ ํ๋ค. ์ด๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ state๊ฐ ์ ๋ง ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฒ ์ํ๋
- ๊ฐ๋ฐ์๊ฐ ์๊ฑฐ๋ ์ ์ด๊ฐ๋ฅํ์ง ์์ ๊ณณ์์ ์ ์ง๋ ์ ์๋ค.
- fetch๋ update์ ์ํด ๋น๋๊ธฐ api๊ฐ ํ์ํ๋ค.
- "๊ณต์ "๋๋ค๋ ๊ฑด ๊ฐ๋ฐ์๊ฐ ๋ชจ๋ฅด๋ ์ฌ์ด์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ฃผ์๋ฅผ ํ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ผ๋ก "out of date (์ต์ ์ด ์๋ ์ํ)"๊ฐ ๋ ์ ์๋ค.
๋ฟ๋ง ์๋๋ผ ์๋ฒ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ๋ค๋ ํด๊ฒฐํด์ผ ํ๋ค๋ ์ ์์ ๋ ๊น๋ค๋กญ๋ค:
- ์บ์ฑ(caching)
- ์ฌ๋ฌ ์ค๋ณต ์์ฒญ์ ํ ๋ฒ์ ์์ฒญ์ผ๋ก ์ค์ด๊ธฐ(Deduping)
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ต์ ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ
- ์ต๋ํ ๋นจ๋ฆฌ ์ ๋ฐ์ดํธ ๋ฒ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ๊ธฐ
- ํ์ด์ง(pagination)๊ณผ lazy loading ๋ฐ์ดํฐ์ ๊ฐ์ ์ฑ๋ฅ ์ต์ ํ
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์๋ฒ ์ํ์ ๊ฐ๋น์ง ์ปฌ๋ ์
- structural sharing์ผ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ๋ชจ์ด์ ์ด์
Tanstack ์ฟผ๋ฆฌ๋ฅผ ํตํด
- ๋ณต์กํ๊ณ ๋ง์ ๋์ ์ฝ๋๋ฅผ react query ๋ก์ง ๋ช ์ค๋ก ์ค์ผ ์ ์๋ค.
- ์๋ก์ด ์๋ฒ ์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฑฑ์ ํ์ง ์๊ณ ๋ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
- ์ง์ ์ ์ ๋๋จ์ ์ํฅ์ ๊ฐํด์ ๋ฐ์์ฑ์ด ์ข์ ์ฑ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ค.
- ์ ์ฌ์ ์ผ๋ก bandwidth์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋์์ ์ค ์ ์๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์ tanstack query๋ฅผ ํตํด์ ์์ ๊ฐ๋ฅํ ์ฅ์ ๋ค์
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ฌ ์ฌ์ ๊ณก์ ๋ํ ์์ฒญ์ ํ ๊ฒฝ์ฐ, ํด๋น ๋ ธ๋์ ๋ํ ๊ฐ์ฌ๋ฅผ ๊ฐ์ ธ์ค๋ api๊ฐ ์คํจํ ์ ์๋ค (ํด๋น ๋ ธ๋์ ๊ฐ์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ ธ๋ ๊ฒ์ ํค์๋๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ ๋ฑ). ๊ณ์ ๊ฒ์์ ํ๋ ๊ฒ ์๋๋ผ, ์คํจ ํ์๊ฐ ์ดํ๋ก๋ง ์์ฒญ์ ํ๋๋ก tanstack query๋ก์ง์ผ๋ก ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ฌดํ ์คํฌ๋กค๋ง ๋ก์ง ๊ฐ์ํ
- ๋ฐ์ดํฐ ์บ์ฑ, ์ด์ ๋ฐ์ดํฐ ๋ณด์กด : ์ํฐ์คํธ ๊ฒ์ ๋ฑ์ ํ์ด์ง๋ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์์ฒญํ๋ ๋์ ์ฌ๋ฐฑ์ ๋ณด์ฌ์ฃผ๊ธฐ๋ณด๋ค๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ fetchํด์์ ๋ณด์ฌ์ค ๋๊น์ง ์ ์งํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํ์ฌ, ์ ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ tanstack query๊ฐ ์ด๋ค ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ ์ง์ ๋ํด ์ดํด๋ดค๋ค. ์ด์ tanstack ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ค์ ๋ค์ ํด๋ณด์.
Tanstack Query ์ฌ์ฉ
์ค์น
yarn add @tanstack/react-query
๊ฐ๋ฐ ๋๊ตฌ๋ ์ค์นํด์ฃผ์.
๋ฒ๋ค๋ ๋ process.env.NODE_ENV==='development'์ผ ๊ฒฝ์ฐ์๋ง ํฌํจ๋๋ฏ๋ก ํ๋ก๋์ ๋น๋์ ํฌํจ๋ ๊ฑฑ์ ์ ์ ํด๋ ๋์ง๋ง, next+13์์ app ๊ฒฝ๋ก ์ฌ์ฉ ์ dev dependency๋ก ์ค์ ํด์ผ ํ๊ณ ํ๋ค. dev ํ๊ฒฝ์๋ง ์ฐ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ only ํ๋ก์ ํธ์ง๋ง ์ผ๊ด์ฑ ์๊ฒ dev dependency๋ก ์ค์ ํ๊ธฐ๋ก ํ๋ค.
yarn add @tanstack/react-query-devtools --save-dev
- tanstackQuery.tsx : ์ต์๋จ์ ์ฟผ๋ฆฌ ํด๋ผ์ด์ธํธ๋ก ๊ฐ์ธ์ค์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
- ์ด๋ queryClient์ ๊ธฐ๋ณธ ์ต์ ์ ์ค์ ํ ์ ์๋๋ฐ, ์ฟผ๋ฆฌ staleTime (fresh ํจ์ ์ ์งํ ์๊ฐ)์ 60*100๋ก ์ค์ ํด ์คฌ๋ค.
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { ReactNode } from 'react';
const queryClient = new QueryClient({
defaultOptions: { queries: { staleTime: 60 * 100 } },
});
const isDevEnvironment = import.meta.env.DEV;
const TanstackQuery = ({ children }: { children: ReactNode }) => {
return (
<QueryClientProvider client={queryClient}>
{children}
{isDevEnvironment && <ReactQueryDevtools />}
</QueryClientProvider>
);
};
export default TanstackQuery;
- providers/index.ts : ์ ๋ฒ ํฌ์คํ ์ ๋ง๋ค์ด์ค ๋ผ์ฐํฐ๋ฅผ ๊ฐ์ธ์ค๋ค.
import Router from './router';
import TanstackQuery from './tanstackQuery';
const Providers = () => {
return (
<TanstackQuery>
<Router />
</TanstackQuery>
);
};
export default Providers;
https://tanstack.com/query/latest