๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend/TanStack Query

์™œ TanStack Query๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

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