TanStack Query๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ผญ ํ์ํ๋ data-fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑํ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋งํ๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๋ฉฐ, ๋๊ธฐํํ๊ณ , ์ ๋ฐ์ดํธํ๋ ์์ ์ ์์ฃผ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค.
์ ํ์ํ ๊น?
๋๋ถ๋ถ์ ํต์ฌ ์น ํ๋ ์์ํฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ํด ํตํฉ์ ์ด๊ณ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค. ์ด ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ๋ฐ์ดํฐ ํ์นญ์ ๋ํ ์๊ฒฉํ ๊ท์น์ ํฌํจํ๋ ๋ฉํ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฑฐ๋, ์์ ๋ง์ ๋ฐ์ดํฐ ํ์นญ ๋ฐฉ์์ ๋ง๋ค์ด๋ธ๋ค. ์ด๋ ๋ณดํต ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํ ๊ด๋ฆฌ์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฎ๊ฑฐ๋, Redux๋ Zustand ๊ฐ์ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฑ ์ ์ฒด์์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ท๊ฒฐ๋๋ค.
์ ํต์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ client state๋ฅผ ๋ค๋ฃจ๋ ๋ฐ๋ ํ๋ฅญํ์ง๋ง, async or server state๋ฅผ ๋ค๋ฃจ๋ ๋ฐ๋ ๊ทธ๋ค์ง ์ข์ง ์๋ค. ์๋ํ๋ฉด ์๋ฒ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง, ์์ ํ ๋ค๋ฅธ ์ข ๋ฅ์ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๋ฒ์ ์ ์ฅ๋๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ ์ดํ ์ ์๋ ๊ณณ์ ์์นํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ๋น๋๊ธฐ API๊ฐ ํ์ํ๋ค.
- ์ฌ๋ฌ ์ฌ๋๊ณผ ๊ณต์ ๋๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก, ๋ด๊ฐ ๋ชจ๋ฅด๋ ์ฌ์ด์ ๋ค๋ฅธ ์ฌ๋์ ์ํด ๋ณ๊ฒฝ๋ ์ ์๋ค.
- ์ ๋๋ก ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค๋๋ ๋ฐ์ดํฐ๊ฐ ๋ ์ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ํ๊ฐ ๊ฐ์ง ๋ณธ์ง์ ํ์ ํ๊ณ ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ ๋ง์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ๊ฒ ๋๋ค.
- ์บ์ฑ
- ๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ์ฌ๋ฌ ์์ฒญ์ ํ๋๋ก ํฉ์น๊ธฐ
- ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ๋ฐ์ดํธํ๊ธฐ
- ๋ฐ์ดํฐ๊ฐ ์ธ์ ์ค๋๋ ์ํ๊ฐ ๋๋์ง ํ์ ํ๊ธฐ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ฒ ํ๋ฉด์ ๋ฐ์ํ๊ธฐ
- ํ์ด์ง๋ค์ด์ , ๋ฌดํ ์คํฌ๋กค๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ต์ ํ
- ์๋ฒ ์ํ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)
- ๊ตฌ์กฐ์ ๊ณต์ (structural sharing)๋ฅผ ํตํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ๋ชจ์ด์ ์ด์
TanStack Query๋ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ์ต๊ณ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ด๋ค. ๋ณ๋์ ์ค์ ์์ด ๋ฐ๋ก ์ฌ์ฉํด๋ ์ ๋์ํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ์ํ๋ ๋๋ก ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค. TanStack Query๋ฅผ ์ฌ์ฉํ๋ฉด ๊น๋ค๋ก์ด ์๋ฒ ์ํ ๋ฌธ์ ๋ค์ ์ ๋ณตํ๊ณ , ์ฑ ๋ฐ์ดํฐ๊ฐ ๋น์ ์ ํต์ ํ๊ธฐ ์ ์ ๋น์ ์ด ๋ฐ์ดํฐ๋ฅผ ํต์ ํ ์ ์๊ฒ ๋๋ค.
์ข ๋ ๊ธฐ์ ์ ์ธ ๊ด์ ์์ ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ค ๊ฒ์ด๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณต์กํ๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์ ๋ ์ฝ๋๋ฅผ ์๋น์ ์ ๊ฑฐํ๊ณ , ๋จ ๋ช ์ค์ TanStack Query ๋ก์ง์ผ๋ก ๋์ฒดํ ์ ์๋ค.
- ์๋ก์ด ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฑฑ์ ์์ด ์๋ก์ด ๊ธฐ๋ฅ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด์ ๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ ์ข๊ฒ ๋๊ปด์ง๋๋ก ํ์ฌ ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ธ ์ํฅ์ ์ค๋ค.
- ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ ์ค ์ ์๋ค.
์๋ ์์ ๋ TanStack Query๋ฅผ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๋จ์ํ ํํ๋ก ์ฌ์ฉํ์ฌ TanStack Query Github ํ๋ก์ ํธ์ ํต๊ณ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋์ด๋ค.
import {
QueryClient,
QueryClientProvider,
useQuery,
} from '@tanstack/react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isPending, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/TanStack/query').then((res) =>
res.json(),
),
})
if (isPending) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
return (
<div>
<h1>{data.name}</h1>
<p>{data.description}</p>
<strong>๐ {data.subscribers_count}</strong>{' '}
<strong>โจ {data.stargazers_count}</strong>{' '}
<strong>๐ด {data.forks_count}</strong>
</div>
)
}
TanStack Query๋ ์ฒ์ ์ฌ์ฉํ ๋๋ถํฐ ๊ณต๊ฒฉ์ ์ด๋ฉด์๋ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋์ด ์๋ค. ๋๋ก๋ ์ด ๊ธฐ๋ณธ ์ค์ ๋ค์ด ์๋ก์ด ์ฌ์ฉ์๋ค์ ๋นํฉํ๊ฒ ํ๊ฑฐ๋, ๋ด์ฉ์ ์ ๋ชจ๋ฅผ ๊ฒฝ์ฐ ํ์ต ๋ฐ ๋๋ฒ๊น ์ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ค.
TanStack Query๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๋ฉด์ ๋ค์ ์ฌํญ๋ค์ ๊ผญ ๊ธฐ์ตํ์.
useQuery๋ useInfiniteQuery๋ฅผ ํตํด ์์ฑ๋ ์ฟผ๋ฆฌ ์ธ์คํด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋ ๋ฐ์ดํฐ๋ฅผ stale(์ค๋๋) ๋ฐ์ดํฐ๋ก ๊ฐ์ฃผํ๋ค. stale ์ํ์ ๋ฐ์ดํฐ๋ ํน์ ์กฐ๊ฑด์์ ์ฆ์ ๋ค์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ ์ญ ๋๋ ๊ฐ๋ณ ์ฟผ๋ฆฌ์์ staleTime ์ต์ ์ ์ค์ ํ๋ฉด ๋๋ค. staleTime์ ๊ธธ๊ฒ ์ค์ ํ ์๋ก ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ๋น๋๊ฐ ์ค์ด๋ ๋ค.
staleTime์ด ์ค์ ๋ ์ฟผ๋ฆฌ๋ ์ง์ ๋ ์๊ฐ์ด ์ง๋๊ธฐ ์ ๊น์ง fresh(์ ์ ํ) ์ํ๋ก ๊ฐ์ฃผ๋๋ค. fresh ์ํ์ ๋ฐ์ดํฐ๋ ๋ค์ ๊ฐ์ ธ์ค์ง ์๊ณ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ฐํํ๋ค.
- staleTime์ 2 * 60 * 1000 (2๋ถ)์ผ๋ก ์ค์ ํ๋ฉด, 2๋ถ ๋์์ ์๋์ผ๋ก ๋ฌดํจํ(invalidate)ํ์ง ์๋ ์ด์ ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ณ , refetch๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- staleTime์ Infinity๋ก ์ค์ ํ๋ฉด, ์๋์ผ๋ก ๋ฌดํจํํ๊ธฐ ์ ๊น์ง๋ ์ ๋ ์๋์ผ๋ก refetch๋์ง ์๋๋ค.
- staleTime์ 'static'์ผ๋ก ์ค์ ํ๋ฉด, ์๋์ผ๋ก ๋ฌดํจํํด๋ ์ ๋ refetch๋์ง ์๋๋ค.
stale ์ํ์ธ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์๋์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ refetch ๋๋ค.
- ์ฟผ๋ฆฌ์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋ง์ดํธ๋ ๋ - refetchOnMount
- ๋ธ๋ผ์ฐ์ ์ฐฝ์ด ๋ค์ ํฌ์ปค์ค๋ ๋ - refetchOnWindowFocus
- ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐ๋ ๋ - refetchOnReconnect
๊ณผ๋ํ refetch๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด staleTime์ ์กฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด์ง๋ง ์์ ๊ฐ์ ์ต์ ๋ค์ false๋ก ์ค์ ํ์ฌ refetch ์์ ์ ์ง์ ์ ์ดํ ์๋ ์๋ค. refetchInterval ์ต์ ์ ์ฌ์ฉํ๋ฉด staleTime๊ณผ ๋ณ๊ฐ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ refetchํ๋๋ก ์ค์ ํ ์๋ ์๋ค.
useQuery, useInfiniteQuery ๋ฑ ํ์ฑํ๋ ์ธ์คํด์ค๊ฐ ํ๋๋ ์๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ inactive ์ํ๊ฐ ๋๋ค. ์ด ๋ฐ์ดํฐ๋ ๋์ค์ ๋ค์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ์บ์์ ๋จ์์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก inactive ์ํ์ ์ฟผ๋ฆฌ๋ 5๋ถ ํ์ GC(Garbage Collection)์ ์ํด ์บ์์์ ์ญ์ ๋๋ค.
์ด ์๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด gcTime ์ต์ ์ ๊ธฐ๋ณธ๊ฐ์ธ 1000 * 60 * 5 (5๋ถ) ๋ฐ๋ฆฌ์ด๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
์ฟผ๋ฆฌ ์์ฒญ์ด ์คํจํ๋ฉด, UI์ ์๋ฌ๋ฅผ ํ์ํ๊ธฐ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก 3๋ฒ๊น์ง ์๋์ผ๋ก ์ฌ์๋ํ๋ค. ์ด๋ ์ฌ์๋ ๊ฐ์ ๋๋ ์ด๋ exponential backoff ๋ฐฉ์์ผ๋ก ์ ์ฐจ ๋์ด๋๋ค. retry ์ต์ ์ผ๋ก ์ฌ์๋ ํ์, retryDelay ์ต์ ์ผ๋ก ๋๋ ์ด ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ ๊ตฌ์กฐ์ ๊ณต์ ๋ฅผ ํตํด ์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ๊ฐ์งํ๋ค. ๋ง์ฝ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด, ๋ฐ์ดํฐ์ ์ฐธ์กฐ๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ ์ ์ง๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด useMemo๋ useCallback๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ๊ฐ์ ์์ ์ฑ์ ๋์ฌ์ฃผ๋ฉฐ, ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํด ์ฑ๋ฅ์ ์๋์ผ๋ก ์ต์ ํํด์ค๋ค.
๊ตฌ์กฐ์ ๊ณต์ ๋ JSON์ผ๋ก ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์์๋ง ๋์ํ๋ฉฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ํญ์ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ๋ง์ฝ ์๋ต ๋ฐ์ดํฐ๊ฐ ๋งค์ฐ ์ปค์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด, config.structuralSharing์ false๋ก ์ค์ ํ์ฌ ๋นํ์ฑํํ ์ ์๋ค. JSON ํธํ๋์ง ์๋ ๊ฐ์ ๋ค๋ฃจ๋ฉด์๋ ๋ฐ์ดํฐ๊ฐ ๋ณํ๋์ง ๊ฐ์งํ๊ณ ์ถ๋ค๋ฉด, config.structuralSharing์ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ ๋ฌํด ์ด์ ๊ฐ๊ณผ ์ ๊ฐ์ ๋น๊ตํ๋ ๋ฐฉ์์ ์ง์ ๊ตฌํํ ์ ์๋ค.
https://tanstack.com/query/latest/docs/framework/react/overview#motivation
Overview | TanStack Query React Docs
TanStack Query (formerly known as React Query) is often described as the missing data-fetching library for web applications, but in more technical terms, it makes fetching, caching, synchronizing and...
tanstack.com
https://tanstack.com/query/latest/docs/framework/react/guides/important-defaults
Important Defaults | TanStack Query React Docs
Out of the box, TanStack Query is configured with aggressive but sane defaults. Sometimes these defaults can catch new users off guard or make learning/debugging difficult if they are unknown by the u...
tanstack.com
'Frontend > TanStack Query' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Network Mode (0) | 2025.10.24 |
|---|---|
| Query Options (0) | 2025.10.23 |
| Query Functions (0) | 2025.10.22 |
| Query Keys (0) | 2025.10.21 |
| Queries (0) | 2025.10.20 |