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

Query Functions

Query Functions๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋“  ๋  ์ˆ˜ ์žˆ๋‹ค. (promise์„ ๋ฐ˜ํ™˜ํ•˜๋Š”) ๋ฐ˜ํ™˜๋œ promise์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค.

๋‹ค์Œ์˜ ์ฝ”๋“œ๋“ค์€ ์œ ํšจํ•œ ์ฟผ๋ฆฌ ํ•จ์ˆ˜ ๊ตฌ์„ฑ์ด๋‹ค.

1
useQuery({ queryKey: ['todos'], queryFn: fetchAllTodos })
2
useQuery({ queryKey: ['todos', todoId], queryFn: () => fetchTodoById(todoId) })
3
useQuery({
4
queryKey: ['todos', todoId],
5
queryFn: async () => {
6
const data = await fetchTodoById(todoId)
7
return data
8
},
9
})
10
useQuery({
11
queryKey: ['todos', todoId],
12
queryFn: ({ queryKey }) => fetchTodoById(queryKey[1]),
13
})

1. ์—๋Ÿฌ ์ฒ˜๋ฆฌ(handle) ๋ฐ ๋˜์ง€๊ธฐ(throw)

TanStack Query๊ฐ€ query์— ์—๋Ÿฌ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, query ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ promise๋ฅผ throwํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. query ํ•จ์ˆ˜์•ˆ์— ๋˜์ ธ์ง„ ์–ด๋– ํ•œ ์—๋Ÿฌ๋“  query์˜ error ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1
const { error } = useQuery({
2
queryKey: ['todos', todoId],
3
queryFn: async () => {
4
if (somethingGoesWrong) {
5
throw new Error('Oh no!')
6
}
7
if (somethingElseGoesWrong) {
8
return Promise.reject(new Error('Oh no!'))
9
}
10
11
return data
12
},
13
})

2. ๊ธฐ๋ณธ์ (default)์œผ๋กœ ๋ฐœ์ƒ(throw)ํ•˜์ง€ ์•Š๋Š” ๊ธฐํƒ€ ํด๋ผ์ด์–ธํŠธ์™€ fetch ์‚ฌ์šฉ๋ฒ•

axios๋‚˜ graphql-request์™€ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์‹คํŒจํ•œ HTTP ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€๋งŒ, fetch์™€ ๊ฐ™์€ ์ผ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค.

1
useQuery({
2
queryKey: ['todos', todoId],
3
queryFn: async () => {
4
const response = await fetch('/todos/' + todoId)
5
if (!response.ok) {
6
throw new Error('Network response was not ok')
7
}
8
return response.json()
9
},
10
})

3. Query Function Variables(๋ณ€์ˆ˜)

Query keys๋Š” ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, QueryFunctionContext์˜ ์ผ๋ถ€๋กœ Query Function์— ์•Œ๋งž๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋„ˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๋„ˆ์˜ query function๋“ค์„ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

1
function Todos({ status, page }) {
2
const result = useQuery({
3
queryKey: ['todos', { status, page }],
4
queryFn: fetchTodoList,
5
})
6
}
7
8
// Access the key, status and page variables in your query function!
9
function fetchTodoList({ queryKey }) {
10
const [_key, { status, page }] = queryKey
11
return new Promise()
12
}

4. QueryFunctionContext

QueryFunctionContext๋Š” ๊ฐ Query Function์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • queryKey: QueryKey : Query Keys
  • signal?: AbortSignal
  • meta: Record<string, unknown> | undefined
    • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  ํ•„๋“œ

๋˜ํ•œ Infinite Queries๋Š” ๋‹ค์Œ ์˜ต์…˜์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • pageParam: TPageParam
    • ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” page ๋งค๊ฐœ ๋ณ€์ˆ˜
  • direction: 'forward' | 'backward'
    • ํ˜„์žฌ ํŽ˜์ด์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๋ฐฉํ–ฅ