- TanStack Query(React Query v4)๊ฐ ์ ์ ๋ฆด๋ฆฌ์ฆ๋๋ฉด์ v3์ ๋น๊ตํด์ ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ ์ ๋ฆฌ ๋ฌธ์์ ๋๋ค.
- TanStack Query(React Query v4) ๊ณต์ ๋ฌธ์
- TanStack Query(React Query v4) migration ๊ณต์ ๋ฌธ์
- v4๋ถํฐ react-query์์
@tanstack/react-query๋ก ํจํค์ง๊ฐ ๋ณ๊ฒฝ๋์๋ค. ๋ฐ๋ผ์ ์ค์น์ import ํ ๋ ์ฃผ์ํด์ผ ํ๋ค.
$ npm i @tanstack/react-query
# or
$ pnpm add @tanstack/react-query
# or
$ yarn add @tanstack/react-query- ๋ํ, Devtools๋ ๋ณ๋์ ํจํค์ง ์ค์น๊ฐ ํ์ํ๋ค.
$ npm i @tanstack/react-query-devtools
# or
$ pnpm add @tanstack/react-query-devtools
# or
$ yarn add @tanstack/react-query-devtools- import ์, ๋ค์๊ณผ ๊ฐ์ด ํจํค์ง๋ช ์ ์์ ํ๋ฉด ๋๋ค.
// v3
- import { useQuery } from "react-query";
- import { ReactQueryDevtools } from "react-query/devtools";
// v4
+ import { useQuery } from "@tanstack/react-query";
+ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";- v3์์๋ queryKey๋ฅผ ๋ฌธ์์ด ๋๋ ๋ฐฐ์ด๋ก ์ง์ ํ ์ ์์๋ค. ๋ฌธ์์ด๊ณผ ๋ฐฐ์ด ๋ชจ๋ ์ฌ์ฉํ ์ ์์๋๋ฐ ์ฌ์ค React Query๋ ๋ด๋ถ์ ์ผ๋ก๋ ํญ์ Array Keys๋ก๋ง ์๋ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ v4์์๋ ๋ฐฐ์ด๋ก ํต์ผ์ํจ๋ค.
// v3
- useQuery("todos", fetchTodos);
// v4
+ useQuery(["todos"], fetchTodos);- v4๋ถํฐ ๋ ๋์ ์คํ๋ผ์ธ ์ง์์ ์ํ
fetchStatus๊ฐ ๋์ ๋๋ฉด์ ๊ธฐ์กด์idle์ด ๋ฌด์๋ฏธํด์ก์ต๋๋ค.
// v3
- status: "idle";
// v4
+ status: "loading";
+ fetchStatus: "idle";- FetchStatus
- TanStack Query(v4) ์๋ก์ด ์ํ๊ฐ์ธ
fetchStatus๊ฐ ์ถ๊ฐ๋๋ค. - fetchStatus
- fetching: ์ฟผ๋ฆฌ๊ฐ ํ์ฌ ์คํ์ค์ด๋ค.
- paused: ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ์ง๋ง, ์ ์ ์ค๋จ๋ ์ํ
- idle: ์ฟผ๋ฆฌ๊ฐ ํ์ฌ ์๋ฌด ์์ ๋ ์ํํ์ง ์๊ณ ์๋ค.
-
fetchStatus๋ HTTP ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ํ์ ์ข ๋ ๊ด๋ จ๋ ์ํ ๋ฐ์ดํฐ์ด๋ค.
- ์๋ฅผ ๋ค์ด, status๊ฐ
success์ํ๋ผ๋ฉด ์ฃผ๋ก fetchStatus๋idle์ํ์ง๋ง, ๋ฐฑ๊ทธ๋ผ์ด๋์์ re-fetch๊ฐ ๋ฐ์ํ ๋fetching์ํ์ผ ์ ์๋ค. - status๊ฐ ๋ณดํต
loading์ํ์ผ ๋ fetchStatus๋ ์ฃผ๋กfetching๋ฅผ ๊ฐ์ง๋ง, ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋์ด ์์ง ์์ ๊ฒฝ์ฐpaused์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, status๊ฐ
-
์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
- status๋
data๊ฐ ์๋์ง ์๋์ง์ ๋ํ ์ํ - fetchStatus๋ ์ฟผ๋ฆฌ ์ฆ,
queryFn ์์ฒญ์ด ์งํ์ค์ธ์ง ์๋์ง์ ๋ํ ์ํ
- status๋
- v4๋ถํฐ
useQueries๋ ์ธ์๋กqueriesํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค ์ ์๋ค. queries์ ๊ฐ์ ์ฟผ๋ฆฌ ๋ฐฐ์ด์ธ๋ฐ ์ด๋ v3์์ useQueries์๊ฒ ๋๊ฒจ์ฃผ๋ ์ฟผ๋ฆฌ ๋ฐฐ์ด๊ณผ ๋์ผํ๋ค.
// v3
useQueries([
{ queryKey1, queryFn1, options1 },
{ queryKey2, queryFn2, options2 },
]);
// v4
useQueries({
queries: [
{ queryKey1, queryFn1, options1 },
{ queryKey2, queryFn2, options2 },
],
});- ๊ธฐ๋ณธ์ ์ผ๋ก react-query๋ promise๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์๋ ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ, ์ด๋ axios์ ๊ฐ์ data fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋์ด์ง๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก query์ mutation์ด ์ผ์์ค์ง ๋๋ค. ์ด๋, ์ด์ ๋์์ ์คํํ๋ ค๋ฉด
networkMode๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
new QueryClient({
defaultOptions: {
queries: {
networkMode: "offlineFirst", // (+)
},
mutations: {
networkmode: "offlineFirst", // (+)
},
},
});- networkMode์ ์ค์ ๊ฐ์ 3๊ฐ์ง๊ฐ ์๋ค.
- online: ์คํ๋ผ์ธ ์ํ์์ network ์ฐ๊ฒฐ์ด ์๊ธฐ ์ ๊น์ง fetch๋ฅผ ํ์ง ์๊ณ , ์ด๋ ์ฟผ๋ฆฌ์ ์ํ๋ฅผ
fetchStatus:paused๋ก ํ์ํ๋ค. - always: ์คํ๋ผ์ธ ์ํ์์๋ ์จ๋ผ์ธ์ฒ๋ผ fetch๋ฅผ ์๋ํฉ๋๋ค. ์คํ๋ผ์ธ ์ํ์์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด๋
status:error์ํ๊ฐ ๋๋ค. - offlineFirst:
v3์์์ ๋์๊ณผ ๊ฐ์ต๋๋ค. queryFn ์ต์ด ํธ์ถ ํ retry๋ฅผ ๋ฉ์ถ๋ค.
- online: ์คํ๋ผ์ธ ์ํ์์ network ์ฐ๊ฒฐ์ด ์๊ธฐ ์ ๊น์ง fetch๋ฅผ ํ์ง ์๊ณ , ์ด๋ ์ฟผ๋ฆฌ์ ์ํ๋ฅผ
- query filter๋ query์ ์ผ์นํ๋ ํน์ ์กฐ๊ฑด์ ๊ฐ์ง ๊ฐ์ฒด๋ค.
- ์ง๊ธ๊น์ง ํํฐ ์ต์
์ ๋๋ถ๋ถ boolean flag ์กฐํฉ์ด์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ flag๋ฅผ ์กฐํฉํ๋ฉด
๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
active?: boolean
- When set to true it will match active queries.
- When set to false it will match inactive queries.
inactive?: boolean
- When set to true it will match inactive queries.
- When set to false it will match active queries.
- ์๋ฅผ ๋ค์ด ์์ ๊ฐ์
active,inactive๋ ์ต์ ์ ์๋ก์ํธ ๋ฐฐํ์ ์ด๋ค. ์ด ๋ ๋ชจ๋๋ฅผ false์ผ๋ก ์ค์ ํ๋ค๋ฉด? ์ด๋ ๋ง์ด ๋์ง ์๋๋ค. - v4๋ถํฐ๋ ์ด๋ฅผ type์ด๋ผ๋ ์์ฑ์ผ๋ก ํต์ผ์์ผ์ ์๋๋ฅผ ๋ ์ ๋ณด์ฌ์ค ์ ์๊ฒ ๋๋ค.
// v3
- active?: boolean
- inactive?: boolean
// v4
+ type?: 'active' | 'inactive' | 'all'- type ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก
all๋ก ์ค์ ๋๋ฉฐ, active ๋๋ inactive ์ฟผ๋ฆฌ๋ง ์ผ์นํ๋๋ก ์ ํํ ์ ์๋ค.
// Cancel all queries
await queryClient.cancelQueries()
โ
// Remove all inactive queries that begin with `posts` in the key
queryClient.removeQueries({ queryKey: ['posts'], type: 'inactive' })
โ
// Refetch all active queries
await queryClient.refetchQueries({ type: 'active' })
โ
// Refetch all active queries that begin with `posts` in the key
await queryClient.refetchQueries({ queryKey: ['posts'], type: 'active' })- v4๋
React18์๋ํ ์ต๊ณ ์์ค์ ์ง์๊ณผ ํจ๊ป ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
