์ฟผ๋ฆฌ๋ ๊ณ ์ ํ ํค์ ์ฐ๊ฒฐ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค์ ๋ํ ์ ์ธ์ ์์กด์ฑ์ด๋ค. ์ฟผ๋ฆฌ๋ Promise๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ชจ๋ ์ข ๋ฅ์ ํจ์(GET, POST ๋ฉ์๋ ํฌํจ)์ ํจ๊ป ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ง์ฝ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ์๋ Mutations๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ปดํฌ๋ํธ๋ ์ปค์คํ ํ ์์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, useQuery ํ ์ ์ต์ํ ๋ค์ ๋ ๊ฐ์ง ์ธ์์ ํจ๊ป ํธ์ถํด์ผ ํ๋ค.
- ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ๋ ๊ณ ์ ํ ํค
- ๋ค์ ์ค ํ๋๋ฅผ ์ํํ๋ promise๋ฅผ ๋ฐํํ๋ ํจ์
- ๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ ๋ฐํํ๊ฑฐ๋
- ์๋ฌ๋ฅผ ๋ฐ์์ํด
import { useQuery } from '@tanstack/react-query'
function App() {
const info = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
}
๊ณ ์ ํค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๋ฉฐ, ๊ณต์ ํ๋ ๋ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
useQuery๊ฐ ๋ฐํํ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์๋ ํ๋ฉด ํ ํ๋ฆฟ ์์ ์ด๋ ๋ฐ์ดํฐ ์ฌ์ฉ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ค.
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
result ๊ฐ์ฒด์๋ ์์ฐ์ฑ์ ๋์ด๊ธฐ ์ํด ์์๋ฌ์ผ ํ ๋ช ๊ฐ์ง ๋งค์ฐ ์ค์ํ ์ํ๊ฐ ํฌํจ๋์ด ์๋ค. ์ฟผ๋ฆฌ๋ ํน์ ์์ ์ ๋ค์ ์ค ํ๋์ ์ํ๋ง์ ๊ฐ์ง ์ ์๋ค.
- isPending ๋๋ status === 'pending': ์ฟผ๋ฆฌ์ ์์ง ๋ฐ์ดํฐ๊ฐ ์๋ ์ด๊ธฐ ๋ก๋ฉ ์ํ
- isError ๋๋ status === 'error': ์ฟผ๋ฆฌ ์คํ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ ์ํ
- isSuccess ๋๋ status === 'success': ์ฟผ๋ฆฌ๊ฐ ์ฑ๊ณตํ์ผ๋ฉฐ data๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํ
์ด๋ฌํ ์ฃผ์ ์ํ ์ธ์๋ ์ฟผ๋ฆฌ ์ํ์ ๋ฐ๋ผ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- error: ์ฟผ๋ฆฌ๊ฐ isError ์ํ์ผ ๋, error ์์ฑ์ ํตํด ์๋ฌ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
- data: ์ฟผ๋ฆฌ๊ฐ isSuccess ์ํ์ผ ๋, data ์์ฑ์ ํตํด ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- isFetching: ์ด๋ค ์ํ์์๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์ผ ๋(๋ฐฑ๊ทธ๋ผ์ด๋ refetch ํฌํจ), isFetching ๊ฐ์ true๊ฐ ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ๋จผ์ isPending ์ํ๋ฅผ ํ์ธํ๊ณ , ๊ทธ ๋ค์ isError ์ํ๋ฅผ ํ์ธํ ๋ค, ๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋๋์๋ค๊ณ ๊ฐ์ ํ๊ณ ํ๋ฉด์ ๋ ๋๋งํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค.
function Todos() {
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (isPending) {
return <span>Loading...</span>
}
if (isError) {
return <span>Error: {error.message}</span>
}
// We can assume by this point that `isSuccess === true`
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
boolean ๊ฐ ๋์ ๋ฌธ์์ด๋ก ์ํ๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด, status ์ํ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
function Todos() {
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (status === 'pending') {
return <span>Loading...</span>
}
if (status === 'error') {
return <span>Error: {error.message}</span>
}
// also status === 'success', but "else" logic works, too
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
TypeScript๋ pending๊ณผ error ์ํ๋ฅผ ๋จผ์ ํ์ธํ๋ฉด, ๊ทธ ์ดํ ์ฝ๋์์ data์ ํ์ ์ undefined๊ฐ ์๋ ์ค์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ ํํ๊ฒ ์ถ๋ก ํด์ค๋ค.
FetchStatus
status ํ๋ ์ธ์๋, ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ ๊ฐ์ง fetchStatus ์์ฑ๋ ์ ๊ณต๋๋ค.
- fetchStatus === 'fetching': ์ฟผ๋ฆฌ๊ฐ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์ด๋ค.
- fetchStatus === 'paused': ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง, ์ผ์ ์ค์ง๋์๋ค.
- fetchStatus === 'idle': ์ฟผ๋ฆฌ๊ฐ ํ์ฌ ์๋ฌด ์์ ๋ ํ์ง ์๋ ์ ํด ์ํ์ด๋ค.
์ ๋ ๊ฐ์ ๋ค๋ฅธ ์ํ๊ฐ ํ์ํ๊ฐ? (status, fetchStatus)
๋ฐฑ๊ทธ๋ผ์ด๋ refetch๋ stale-while-revalidate ๊ฐ์ ๋ก์ง ๋๋ฌธ์ status์ fetchStatus์ ๋ชจ๋ ์กฐํฉ์ด ๊ฐ๋ฅํด์ง๋ค.
- status๊ฐ success์ธ ์ฟผ๋ฆฌ๋ ๋ณดํต fetchStatus๊ฐ idle์ด์ง๋ง, ๋ฐฑ๊ทธ๋ผ์ด๋ refetch๊ฐ ๋ฐ์ํ๋ฉด fetching์ด ๋ ์๋ ์๋ค. (ํ๋ฉด์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด์, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กฐ์ฉํ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํฉ)
- ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ๋์ด ๋ฐ์ดํฐ๊ฐ ์๋ ์ฟผ๋ฆฌ๋ ๋ณดํต status๊ฐ pending์ด๊ณ fetchStatus๋ fetching์ด์ง๋ง ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์์ผ๋ฉด paused ์ํ๊ฐ ๋ ์๋ ์๋ค.
๋ฐ๋ผ์ ์ฟผ๋ฆฌ๊ฐ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์์ผ๋ฉด์๋ pending ์ํ์ผ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํ๋ค. ํต์ฌ์ ์ธ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- status๋ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ ค์ค๋ค. ๋ฐ์ดํฐ๊ฐ ์๋๊ฐ, ์๋๊ฐ?
- fetchStatus๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์์ธ queryFn์ ๋ํ ์ ๋ณด๋ฅผ ์๋ ค์ค๋ค. ์์ฒญ ํจ์๊ฐ ์คํ ์ค์ธ๊ฐ, ์๋๊ฐ?
https://tanstack.com/query/latest/docs/framework/react/guides/queries
Queries | TanStack Query React Docs
Query Basics A query is a declarative dependency on an asynchronous source of data that is tied to a unique key. A query can be used with any Promise based method (including GET and POST methods) to f...
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 |
| ์ TanStack Query๋ฅผ ์ฌ์ฉํ ๊น? (0) | 2025.10.19 |