๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Front
Tanstack Query
08-Query Keys

Query Keys

๋ณธ์งˆ์ ์œผ๋กœ, TanStack Query๋Š” query keys๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ query ์บ์‹ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค. query keys๋Š” top level์˜ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋‹จ์ผ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฌธ์ž์—ด ๋ฐ ์ค‘์ฒฉ ๊ฐ์ฒด ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค. query keys๊ฐ€ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๊ณ , query keys์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ๋‹ˆํฌ ํ•œ ์ด์ƒ, ๋„ˆ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!


1. ๊ฐ„๋‹จํ•œ Query Keys

key์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋Š” ์ƒ์ˆ˜๊ฐ’์ด ํฌํ•จ๋œ ๋ฐฐ์—ด์ด๋‹ค. ์ด ํ˜•์‹์€ ์œ ์šฉํ•˜๋‹ค. ๋‹ค์Œ์˜ ๊ฒฝ์šฐ:

  • ์ผ๋ฐ˜ ๋ชฉ๋ก/์ธ๋ฑ์Šค ๋ฆฌ์†Œ์Šค
  • Non-hierarchical resources (๊ณ„์ธต์ ์ด์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค)
1
// A list of todos
2
useQuery({ queryKey: ['todos'], ... })
3
4
// Something else, whatever!
5
useQuery({ queryKey: ['something', 'special'], ... })

2. ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด Keys

query์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ๋‹ˆํฌํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋ฌธ์ž์—ด์ด ์žˆ๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์›ํ•˜๋Š” ์ˆ˜๋งŒํผ ์‚ฌ์šฉํ•ด์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

  • ๊ณ„์ธต์ (Hierarchical) ๋˜๋Š” ์ค‘์ฒฉ๋œ ์ž์›
    • ์•„์ดํ…œ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ID, ์ธ๋ฑ์Šค ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ๋ณธ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
  • ์ถ”๊ฐ€์ ์ธ parameters์™€ ํ•จ๊ป˜์ธ Queries
    • ์ถ”๊ฐ€ ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์ด ์ผ๋ฐ˜์ 
1
// An individual todo
2
useQuery({ queryKey: ['todo', 5], ... })
3
4
// An individual todo in a "preview" format
5
useQuery({ queryKey: ['todo', 5, { preview: true }], ...})
6
7
// A list of todos that are "done"
8
useQuery({ queryKey: ['todos', { type: 'done' }], ... })

3. Query Keys๋Š” ๊ฒฐ๋ก ์ ์œผ๋กœ ํ•ด์‹œ ์ฒ˜๋ฆฌ๋จ

์ฆ‰, ๊ฐ์ฒด ์•ˆ์— key๋“ค์˜ ์ˆœ์„œ์™€๋Š” ์ƒ๊ด€์—†์ด, ๋‹ค์Œ์˜ query๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ query keys๋Š” ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์š”์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

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

4. ์ฟผ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์ฟผ๋ฆฌ ํ‚ค์— ํฌํ•จ๋œ ๋ณ€์ˆ˜์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ

query keys๋Š” ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€๊ฒฝ๋˜๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ฟผ๋ฆฌ ํ•จ์ˆ˜์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

1
function Todos({ todoId }) {
2
const result = useQuery({
3
queryKey: ['todos', todoId],
4
queryFn: () => fetchTodoById(todoId),
5
})
6
}

query keys๋Š” query ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ข…์†์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์— ์•Œ์•„๋‘์„ธ์š”. ์ข…์† ๋ณ€์ˆ˜๋ฅผ query keys์— ์ถ”๊ฐ€ํ•˜๋ฉด query๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹œ๋˜๊ณ , ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, query๊ฐ€ ์ž๋™์œผ๋กœ refetch๋ฉ๋‹ˆ๋‹ค.(stableTime ์„ค์ •์— ๋”ฐ๋ผ) ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์ œ๋Š” ์ „์ฒด ์ข…์† ๋ณ€์ˆ˜ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


5. ๋” ์•Œ์•„๋ณด๊ธฐ