Frontend/TanStack Query (8) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ Dependent Queries useQuery dependent Query์ข ์(๋๋ ์์ฐจ์ ) ์ฟผ๋ฆฌ๋ ์ด์ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋์ด์ผ๋ง ์คํ๋ ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ๋งํ๋ค. ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ฐ๋จํ๋ค. // ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐconst { data: user } = useQuery({ queryKey: ['user', email], queryFn: getUserByEmail,})const userId = user?.id// ์ฌ์ฉ์์ ํ๋ก์ ํธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐconst { status, fetchStatus, data: projects,} = useQuery({ queryKey: ['projects', userId], queryFn: getProjectsByUser, // userId๊ฐ ์กด์ฌํ ๋๊น์ง ์ฟผ๋ฆฌ๋ ์คํ๋์ง ์๋๋ค. enabl.. Parallel Queries "Parallel"(๋ณ๋ ฌ) ์ฟผ๋ฆฌ๋ fetching ๋์์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ๋ณ๋ ฌ๋ก, ์ฆ ๋์์ ์คํ๋๋ ์ฟผ๋ฆฌ์ด๋ค. Manual Parallel Queries: ์๋ ๋ณ๋ ฌ ์ฟผ๋ฆฌ๋ณ๋ ฌ ์ฟผ๋ฆฌ์ ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด, ๋ณ๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ณ๋ค๋ฅธ ๋ ธ๋ ฅ์ด ํ์ํ์ง ์๋ค. TanStack Query์ useQuery ๋ฐ useInfiniteQuery ํ ์ ์ํ๋ ๋งํผ ๋๋ํ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. function App () { // ๋ค์ ์ฟผ๋ฆฌ๋ค์ ๋ณ๋ ฌ๋ก ์คํ๋๋ค const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers }) const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fet.. Network Mode TanStack Query์ ๋คํธ์ํฌ ๋ชจ๋๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ์์ ๋ ์ฟผ๋ฆฌ์ ๋ฎคํ ์ด์ ์ด ์ด๋ป๊ฒ ๋์ํ ์ง ๊ฒฐ์ ํ๋ 3๊ฐ์ง ์ค์ ์ ์ ๊ณตํ๋ค. ์ด ๋ชจ๋๋ ๊ฐ ์ฟผ๋ฆฌ/๋ฎคํ ์ด์ ์ ๊ฐ๋ณ์ ์ผ๋ก ์ค์ ํ๊ฑฐ๋, ๊ธฐ๋ณธ๊ฐ์ ํตํด ์ ์ญ์ผ๋ก ์ค์ ํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ํจ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉ๋๋ฏ๋ก, ๊ธฐ๋ณธ ๋คํธ์ํฌ ๋ชจ๋๋ online์ด๋ค. Network Mode: online์ด ๋ชจ๋์์๋ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ด ์์ ๋๋ง ์ฟผ๋ฆฌ์ ๋ฎคํ ์ด์ ์ด ์คํ๋๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ์์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ ๊ฒฝ์ฐ, ํด๋น ์ฟผ๋ฆฌ๋ ๊ธฐ์กด์ state(pending, error, success) ์ํ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ค. ํ์ง๋ง ์ด๋ fetchStatus๋ผ๋ ์ถ๊ฐ์ ์ธ ์ํ๊ฐ ์ ๊ณต๋์ด ๋ ์์ธํ ์ํฉ์ ์ ์ ์๋ค.fetching: .. Query Options queryKey์ queryFn์ ์ฌ๋ฌ ๊ณณ์์ ๊ณต์ ํ๋ฉด์๋ ๊ด๋ จ ์ฝ๋๋ฅผ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋๋ queryOptions helper๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ฐํ์ ์ ์ด ํฌํผ๋ ์ ๋ฌ๋ฐ์ ์ต์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ๋ฐํํ ๋ฟ์ด์ง๋ง, TypeScript์ ํจ๊ป ์ฌ์ฉํ ๋ ์๋ง์ ์ด์ ์ ์ ๊ณตํ๋ค. ์ฟผ๋ฆฌ์ ํ์ํ ๋ชจ๋ ์ต์ ์ ํ ๊ณณ์์ ์ ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด type inference(ํ์ ์ถ๋ก )๊ณผ type safety(ํ์ ์์ ์ฑ)์ ์๋ฒฝํ๊ฒ ๋ณด์ฅ๋ฐ์ ์ ์๋ค.import { queryOptions } from '@tanstack/react-query'function groupOptions(id: number) { return queryOptions({ queryKey: ['gro.. 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({ .. Query Keys TanStack Query์ ํต์ฌ์ ์ฟผ๋ฆฌ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ ์บ์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค. ์ฟผ๋ฆฌ ํค๋ ๋ฐ๋์ ์ต์์ ๋ ๋ฒจ์์ ๋ฐฐ์ด์ด์ด์ผ ํ๋ค. ['todos']์ฒ๋ผ ๋จ์ผ ๋ฌธ์์ด์ ๊ฐ์ง ๊ฐ๋จํ ๋ฐฐ์ด์ผ ์๋ ์๊ณ , ์ฌ๋ฌ ๋ฌธ์์ด๊ณผ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ๋ณต์กํ ๋ฐฐ์ด์ผ ์๋ ์๋ค. ์ฟผ๋ฆฌ ํค๊ฐ JSON.stringfy๋ก ์ง๋ ฌํ ๊ฐ๋ฅํ๊ณ ํด๋น ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ ์๋ง ์๋ค๋ฉด ์ด๋ค ํํ๋ ์ฌ์ฉํ ์ ์๋ค. Simple Query Keys๊ฐ์ฅ ๊ฐ๋จํ ํํ์ ํค๋ ์์ ๊ฐ์ผ๋ก๋ง ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ด๋ค. ์ด ํ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.์ผ๋ฐ์ ์ธ ๋ชฉ๋ก/์ธ๋ฑ์ค ๋ฆฌ์์ค๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์๋ ๋ฆฌ์์ค// A list of todosuseQuery({ queryKey: ['todos'], ... })// Something els.. Queries ์ฟผ๋ฆฌ๋ ๊ณ ์ ํ ํค์ ์ฐ๊ฒฐ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค์ ๋ํ ์ ์ธ์ ์์กด์ฑ์ด๋ค. ์ฟผ๋ฆฌ๋ Promise๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ชจ๋ ์ข ๋ฅ์ ํจ์(GET, POST ๋ฉ์๋ ํฌํจ)์ ํจ๊ป ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ง์ฝ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ์๋ Mutations๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์ปดํฌ๋ํธ๋ ์ปค์คํ ํ ์์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, useQuery ํ ์ ์ต์ํ ๋ค์ ๋ ๊ฐ์ง ์ธ์์ ํจ๊ป ํธ์ถํด์ผ ํ๋ค.์ฟผ๋ฆฌ๋ฅผ ์๋ณํ๋ ๊ณ ์ ํ ํค๋ค์ ์ค ํ๋๋ฅผ ์ํํ๋ promise๋ฅผ ๋ฐํํ๋ ํจ์๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์ ๋ฐํํ๊ฑฐ๋์๋ฌ๋ฅผ ๋ฐ์์ํดimport { useQuery } from '@tanstack/react-query'function App() { const info = useQuery({ query.. ์ TanStack Query๋ฅผ ์ฌ์ฉํ ๊น? TanStack Query๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ผญ ํ์ํ๋ data-fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑํ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋งํ๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๋ฉฐ, ๋๊ธฐํํ๊ณ , ์ ๋ฐ์ดํธํ๋ ์์ ์ ์์ฃผ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค. ์ ํ์ํ ๊น?๋๋ถ๋ถ์ ํต์ฌ ์น ํ๋ ์์ํฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ํด ํตํฉ์ ์ด๊ณ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค. ์ด ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ๋ฐ์ดํฐ ํ์นญ์ ๋ํ ์๊ฒฉํ ๊ท์น์ ํฌํจํ๋ ๋ฉํ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฑฐ๋, ์์ ๋ง์ ๋ฐ์ดํฐ ํ์นญ ๋ฐฉ์์ ๋ง๋ค์ด๋ธ๋ค. ์ด๋ ๋ณดํต ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํ ๊ด๋ฆฌ์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฎ๊ฑฐ๋, Redux๋ Zustand ๊ฐ์ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฑ ์ ์ฒด์์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ท๊ฒฐ๋๋ค. ์ ํต์ ์ธ .. ์ด์ 1 ๋ค์