Skip to content

Latest commit

ย 

History

History
205 lines (149 loc) ยท 6.55 KB

File metadata and controls

205 lines (149 loc) ยท 6.55 KB

๐Ÿ’ป Migrating to TanStack Query(React) v4

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-08-17 แ„‹แ…ฉแ„’แ…ฎ 2 20 01


๐Ÿ“ƒ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

@tanstack/react-query

  • 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);

status idle ์ƒํƒœ ์ œ๊ฑฐ

  • v4๋ถ€ํ„ฐ ๋” ๋‚˜์€ ์˜คํ”„๋ผ์ธ ์ง€์›์„ ์œ„ํ•œ fetchStatus๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ๊ธฐ์กด์˜ idle์ด ๋ฌด์˜๋ฏธํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
// v3
- status: "idle";

// v4
+ status: "loading";
+ fetchStatus: "idle";

fetchStatus๊ฐ€ ์ถ”๊ฐ€

  • FetchStatus
  • TanStack Query(v4) ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์ธ fetchStatus๊ฐ€ ์ถ”๊ฐ€๋๋‹ค.
  • fetchStatus
    • fetching: ์ฟผ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ด๋‹ค.
    • paused: ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ–ˆ์ง€๋งŒ, ์ž ์‹œ ์ค‘๋‹จ๋œ ์ƒํƒœ
    • idle: ์ฟผ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

์™œ status, fetchStatus ๋‚˜๋ˆ ์„œ ๋‹ค๋ฃจ๋Š” ๊ฑธ๊นŒ?

  • fetchStatus๋Š” HTTP ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ์™€ ์ข€ ๋” ๊ด€๋ จ๋œ ์ƒํƒœ ๋ฐ์ดํ„ฐ์ด๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด, status๊ฐ€ success ์ƒํƒœ๋ผ๋ฉด ์ฃผ๋กœ fetchStatus๋Š” idle ์ƒํƒœ์ง€๋งŒ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ re-fetch๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ fetching ์ƒํƒœ์ผ ์ˆ˜ ์žˆ๋‹ค.
    • status๊ฐ€ ๋ณดํ†ต loading ์ƒํƒœ์ผ ๋•Œ fetchStatus๋Š” ์ฃผ๋กœ fetching๋ฅผ ๊ฐ–์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ paused ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    • status๋Š” data๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ์ƒํƒœ
    • fetchStatus๋Š” ์ฟผ๋ฆฌ ์ฆ‰, queryFn ์š”์ฒญ์ด ์ง„ํ–‰์ค‘์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์ƒํƒœ
  • why-two-different-states


useQueries

  • v4๋ถ€ํ„ฐ useQueries๋Š” ์ธ์ž๋กœ queries ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • queries์˜ ๊ฐ’์€ ์ฟผ๋ฆฌ ๋ฐฐ์—ด์ธ๋ฐ ์ด๋Š” v3์—์„œ useQueries์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋˜ ์ฟผ๋ฆฌ ๋ฐฐ์—ด๊ณผ ๋™์ผํ•˜๋‹ค.
// v3
useQueries([
  { queryKey1, queryFn1, options1 },
  { queryKey2, queryFn2, options2 },
]);

// v4
useQueries({
  queries: [
    { queryKey1, queryFn1, options1 },
    { queryKey2, queryFn2, options2 },
  ],
});

networkMode

  • ๊ธฐ๋ณธ์ ์œผ๋กœ 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๋ฅผ ๋ฉˆ์ถ˜๋‹ค.

Query Filters

  • 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' })

React18 ์ง€์›

  • v4๋Š” React18์—๋Œ€ํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ง€์›๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ