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

Frontend/TanStack Query

Query Functions

์ฟผ๋ฆฌ ํ•จ์ˆ˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด promise๋Š” ๋ฐ์ดํ„ฐ๋ฅผ reslove(์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ)ํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ๋ฅผ throwํ•ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ์€ ๋ชจ๋‘ ์œ ํšจํ•œ ์ฟผ๋ฆฌ ํ•จ์ˆ˜ ์„ค์ •์˜ ์˜ˆ์‹œ์ด๋‹ค.

useQuery({ queryKey: ['todos'], queryFn: fetchAllTodos })
useQuery({ queryKey: ['todos', todoId], queryFn: () => fetchTodoById(todoId) })
useQuery({
  queryKey: ['todos', todoId],
  queryFn: async () => {
     const data = await fetchTodoById(todoId)
     return data
   },
 })
 useQuery({
   queryKey: ['todos', todoId],
   queryFn: ({ queryKey }) => fetchTodoById(queryKey[1]),
 })

 

์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ

Tanstack Query๊ฐ€ ์ฟผ๋ฆฌ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ธ์ง€ํ•˜๋ ค๋ฉด, ์ฟผ๋ฆฌ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์—๋Ÿฌ๋ฅผ throwํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋œ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ์ฟผ๋ฆฌ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์—๋Ÿฌ๋Š” ์ฟผ๋ฆฌ์˜ error ์ƒํƒœ์— ์ €์žฅ๋œ๋‹ค.

const { error } = useQuery({
  queryKey: ['todos', todoId],
  queryFn: async () => {
    if (somethingGoesWrong) {
      throw new Error('Oh no!')
    }
    if (somethingElseGoesWrong) {
      return Promise.reject(new Error('Oh no!'))
    }
    
    return data
  },
})

 

fetch์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

axios๋‚˜ graphql-request ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” HTTP ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜๋ฉด ์ž๋™์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋งŒ, fetch์™€ ๊ฐ™์€ ์ผ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, fetch๋Š” 404๋‚˜ 500 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์—๋Ÿฌ๋ฅผ throwํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ด ๊ฒฝ์šฐ, ์ง์ ‘ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ fetch API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

useQuery({
  queryKey: ['todos', todoId],
  queryFn: async () => {
    const response = await fetch('/todos/' + todoId)
    if (!response.ok) {
      throw new Error('Network response was not ok')
    }
    return response.json()
  },
})

 

์ฟผ๋ฆฌ ํ•จ์ˆ˜ ๋ณ€์ˆ˜

์ฟผ๋ฆฌ ํ‚ค๋Š” ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ์šฉ๋„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ฟผ๋ฆฌ ํ•จ์ˆ˜์— QueryFunctionContext์˜ ์ผ๋ถ€๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ด ๊ธฐ๋Šฅ ๋•๋ถ„์— ํ•„์š”ํ•˜๋‹ค๋ฉด ์ฟผ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 

function Todos({ status, page }) {
const result = useQuery({
  queryKey: ['todos', { status, page }],
  queryFn: fetchTodoList,
 })
}

// queryKey๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹นํ•˜์—ฌ status์™€ page ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
function fetchTodoList({ queryKey }) {
  const [_key, { status, page }] = queryKey // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ๋ฌด์‹œํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด์—์„œ status์™€ page๋ฅผ ์ถ”์ถœ
  return new Promise()
}

 

QueryFunctionContext

QueryFunctionContext๋Š” ๊ฐ ์ฟผ๋ฆฌ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค์„ ํฌํ•จํ•œ๋‹ค. 

  • queryKey: QueryKey
    • ์ฟผ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ํ‚ค์ด๋‹ค.
  • client: QueryClient
    • ํ˜„์žฌ QueryClient์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค.
  • signal?: AbortSignal
    • TanStack Query์—์„œ ์ œ๊ณตํ•˜๋Š” AbortSignal ์ธ์Šคํ„ด์Šค์ด๋‹ค.
    • Query Cancellation์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
  • meta: Record<string, unknown> | undefined
    • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  ํ•„๋“œ์ด๋‹ค.

๋˜ํ•œ, Infinite Queries์—์„œ๋Š” ๋‹ค์Œ ์˜ต์…˜๋“ค์ด ์ถ”๊ฐ€๋กœ ์ „๋‹ฌ๋œ๋‹ค.

  • PageParam: TPageParam
    • ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ํŽ˜์ด์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค.
  • direction: 'forward' | 'backward'
    • deprecated
    • ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉํ–ฅ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด getNextPageParam์ด๋‚˜ getPreviousPageParam ํ•จ์ˆ˜์—์„œ pageParam ๊ฐ์ฒด์— direction ์ •๋ณด๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 

Query Functions | TanStack Query React Docs

A query function can be literally any function that returns a promise. The promise that is returned should either resolve the data or throw an error. All of the following are valid query function conf...

tanstack.com

 

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

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