Queries
1. Query Basics
query๋ (unique key์ ๊ฒฐํฉ๋,) (๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค์) ์ ์ธ์ ์ข ์์ฑ์ด๋ค. ํ๋ก๋ฏธ์ค ๊ธฐ๋ฐ์ method(GET, POST)๋ก ์๋ฒ๋ก๋ถํฐ data๋ฅผ fetchํ ์ ์๋ค. ๋ง์ฝ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ผ ํ๋ค๋ฉด, Mutations๋ฅผ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋์ ์ปดํฌ๋ํธ๋ ์ปค์คํ ํ ์์ query๋ฅผ ๊ตฌ๋ ํ๊ธฐ ์ํด์๋, ์ต์ํ ๋ค์๊ณผ ๊ฐ์ด useQuery๋ฅผ ํธ์ถํด๋ผ.
- query๋ฅผ ์ํ unique key
- ๋ค์๊ณผ ๊ฐ์ promise๋ฅผ ๋ฐํํ๋ ํจ์
- resolves the data, or
- throws an error
1import { useQuery } from '@tanstack/react-query'23function App() {4const info = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })5}
๋๊ฐ ์ ๊ณตํ๋ unique key๋ ๋์ query๋ค์ด ์ฑ ์ ์ฒด์์ refetching, caching, sharingํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
useQuery์์ ๋ฐํ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์๋ () ํฌํจ๋์ด ์๋ค. (ํ ํ๋ฆฟ์ ํ์ํ query ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ์ฌ์ฉ์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ,):
1const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
result ๊ฐ์ฒด์๋ ๋ช๊ฐ์ง ์์ฐ์ฑ์ ์ํ ์์ฃผ ์ค์ํ ์ํ๊ฐ ํฌํจ๋์ด ์๋ค.
query๋ ์ฃผ์ด์ง ์๊ฐ(given moment)์ ๋ค์ ์ค ํ๋์ ์ํ๋ง ๊ฐ์ง ์ ์๋ค.
isLoadingorstatus === 'loading'- ์ฟผ๋ฆฌ์ ์์ง ๋ฐ์ดํฐ๊ฐ ์๋isErrororstatus === 'error'- ์ฟผ๋ฆฌ์ ์ค๋ฅ๊ฐ ๋ฐ์isSuccessorstatus === 'success'- ์ฟผ๋ฆฌ๊ฐ ์ฑ๊ณตํ์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ฌ์ฉ ๊ฐ๋ฅ
์์ ๊ฐ์ ์ฃผ์ํ ์ํ ๋ง๊ณ ๋, ์ฟผ๋ฆฌ ์ํ์ ๋ฐ๋ผ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
error- query๊ฐisError์ํ๋ฉด,error์์ฑ์ ํตํด ์ค๋ฅ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅdata- query๊ฐ isSuccess ์ํ๋ฉด,data์์ฑ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅisFetching- ์ด๋ค ์ํ์ด๋ , query๊ฐ ์ธ์ ๋ ์ง fetch ์ค์ด๋ฉด(background refetching ํฌํจํด์),isFetching์ด true๊ฐ ๋จ
๋๋ถ๋ถ์ query์ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋ก isPending ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ถฉ๋ถํ๋ค.
๊ทธ๋ฐ ๋ค์, isError ์ํ๋ฅผ ํ์ธํ๊ณ ,
๊ทธ ๋ค์ ๋ง์ง๋ง์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ , ์ฑ๊ณต ์ํ๋ฅผ ๋ ๋๋งํฉ๋๋ค:
1function Todos() {2const { isPending, isError, data, error } = useQuery({3queryKey: ['todos'],4queryFn: fetchTodoList,5})67if (isPending) {8return <span>Loading...</span>9}1011if (isError) {12return <span>Error: {error.message}</span>13}1415// We can assume by this point that `isSuccess === true`16return (17<ul>18{data.map(todo => (19<li key={todo.id}>{todo.title}</li>20))}21</ul>22)23}
๋ง์ฝ booleans์ด ๋ค ๊ฒ์ด ์๋๋ผ๋ฉด, ๋๋ ํญ์ status ์ํ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค:
1function Todos() {2const { status, data, error } = useQuery({3queryKey: ['todos'],4queryFn: fetchTodoList,5})67if (status === 'pending') {8return <span>Loading...</span>9}1011if (status === 'error') {12return <span>Error: {error.message}</span>13}1415// also status === 'success', but "else" logic works, too16return (17<ul>18{data.map(todo => (19<li key={todo.id}>{todo.title}</li>20))}21</ul>22)23}
๋ํ TypeScript๋ ๋ฐ์ดํฐ ํ์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ขํ๋ค. ๋ง์ฝ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ ์, pending ๋ฐ error๋ฅผ ํ์ธํ๋ค๋ฉด,
2. FetchStatus(fetch ์ํ๋ค)
status ํ๋ ์ธ์๋, ์ถ๊ฐ์ ์ผ๋ก ๋ค์์ ์ต์
๋ค์ ์ง๋ fetchStatus ์์ฑ๋ ์๋ค.
fetchStatus === 'fetching'- query๊ฐ ํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์คfetchStatus === 'paused'- query๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ์ง๋ง, ์ผ์์ค์ง๋จ. ์์ธํ ๋ด์ฉ์ ๋คํธ์ํฌ ๋ชจ๋ ํ์ด์ง ์ฐธ๊ณfetchStatus === 'idle'- query๊ฐ ํ์ฌ ์๋ฌด ์์ ๋ ์ํํ์ง ์์
3. ์ ๋ค๋ฅธ ์ํ๊ฐ 2๊ฐ๋?
๋ฐฑ๊ทธ๋ผ์ด๋ refetches์ ์ค๋๋ ๊ฒ์ฆ ๋ก์ง์ ๋ชจ๋ status์ fetchStatus์ ์ํ ์กฐํฉ์ ๋ง๋ค ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด:
success ์ํ์ query๋ ์ผ๋ฐ์ ์ผ๋กidlefetchStatus์ด์ง๋ง, ๋ฐฑ๊ทธ๋ผ์ด๋ refetch๊ฐ ๋ฐ์ํ์๋,fetching์๋ ์์ ์ ์๋ค.- ๋ง์ดํธ๋๊ณ ๋ฐ์ดํฐ๊ฐ ์๋ query๋ ์ผ๋ฐ์ ์ผ๋ก
pending๊ณผfetchingfetchStatus์ง๋ง, ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์๋ ๊ฒฝ์ฐpaused๋ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ๋, query๊ฐ pending ์ํ์ ์์ ์ ์์์ ๋ช
์ฌํ์!
status๋data์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ๋ฐ์ดํฐ๊ฐ ์๋์ง ์๋์ง?fetchStatus๋queryFn์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ์ง๊ธ ์คํ๋๊ณ ์๋์ง ์๋์ง?
4. ๋ ์์๋ณด๊ธฐ
์ํ ํ์ธ์ ์ํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ปค๋ฎค๋ํฐ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ์ญ์์ค