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

Frontend/TanStack Query

Query Keys

TanStack Query์˜ ํ•ต์‹ฌ์€ ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ ์บ์‹ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฟผ๋ฆฌ ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•œ๋‹ค. ['todos']์ฒ˜๋Ÿผ ๋‹จ์ผ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ๊ฐ„๋‹จํ•œ ๋ฐฐ์—ด์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด๊ณผ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณต์žกํ•œ ๋ฐฐ์—ด์ผ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

์ฟผ๋ฆฌ ํ‚ค๊ฐ€ JSON.stringfy๋กœ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ์–ด๋–ค ํ˜•ํƒœ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Simple Query Keys

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ํ‚ค๋Š” ์ƒ์ˆ˜ ๊ฐ’์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์ด๋‹ค. ์ด ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

  • ์ผ๋ฐ˜์ ์ธ ๋ชฉ๋ก/์ธ๋ฑ์Šค ๋ฆฌ์†Œ์Šค
  • ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๋ฆฌ์†Œ์Šค
// A list of todos
useQuery({ queryKey: ['todos'], ... })

// Something else, whatever !
useQuery({ queryKey: ['something', 'special'], ... })

 

Array Keys with variables

์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐฐ์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

  • ๊ณ„์ธต์ ์ด๊ฑฐ๋‚˜ ์ค‘์ฒฉ๋œ ๋ฆฌ์†Œ์Šค
    • ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ID, ์ธ๋ฑ์Šค ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ๋ณธ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
  • ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ฟผ๋ฆฌ
    • ์ถ”๊ฐ€ ์˜ต์…˜์ด ๋‹ด๊ธด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
// An individual todo
useQuery({ queryKey: ['todo', 5], ... })

// An individual todo in a "preview" format
useQuery({ queryKey: ['todo', 5, { preview: true }], ... })

// A list of todos that are "done"
useQuery({ queryKey: ['todos', { type: 'done' }], ... })

 

Query Keys are hashed deterministically!

์ด๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ํ‚ค ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋“ค์ด ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

useQuery({ queryKey: ['todos', { status, page }], ... })
useQuery({ queryKey: ['todos', { page, status }], ... })
useQuery({ queryKey: ['todos', { page, status, other: undefined }], ... })

 

ํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์—์„œ๋Š” ์š”์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์ฟผ๋ฆฌ ํ‚ค๋“ค์€ ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

useQuery({ queryKey: ['todos', status, page], ... })
useQuery({ queryKey: ['todos', page, statue], ... })
useQuery({ queryKey: ['todos', undefined, page, status], ...})

 

์ฟผ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜์— ์˜์กดํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ์ฟผ๋ฆฌ ํ‚ค์— ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

์ฟผ๋ฆฌ ํ‚ค๋Š” ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋ฏ€๋กœ, ์ฟผ๋ฆฌ ํ•จ์ˆ˜(queryFn)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ ํ‚ค์— ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

function Todos({ todoId }) {
  const result = useQuery({
    queryKey: ['todos', todoId],
    queryFn: () => fetchTodoById(todoId),
  })
}

 

์ฟผ๋ฆฌ ํ‚ค๋Š” ์ฟผ๋ฆฌ ํ•จ์ˆ˜์˜ ์˜์กด์„ฑ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค. ์˜์กดํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ ํ‚ค์— ์ถ”๊ฐ€ํ•˜๋ฉด, ํ•ด๋‹น ๋ณ€์ˆ˜ ๊ฐ’๋งˆ๋‹ค ์ฟผ๋ฆฌ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹œ๋œ๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฟผ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. (staleTime ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.)

 

https://tanstack.com/query/latest/docs/framework/react/guides/query-keys

 

Query Keys | TanStack Query React Docs

At its core, TanStack Query manages query caching for you based on query keys. Query keys have to be an Array at the top level, and can be as simple as an Array with a single string, or as complex as...

tanstack.com

 

'Frontend > TanStack Query' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Network Mode  (0) 2025.10.24
Query Options  (0) 2025.10.23
Query Functions  (0) 2025.10.22
Queries  (0) 2025.10.20
์™œ TanStack Query๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?  (0) 2025.10.19