#์‹œ์ž‘ํ•˜๋ฉฐ ์นœ๊ตฌ๋“ค๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ React Query ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์ฐพ์•„๋ณด๋‹ˆ api๋“ฑ์˜ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ผ๋Š” ๊ฒƒ์œผ๋กœ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋„ react๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•ด๋ณด์•˜์ง€๋งŒ ๋‹จ์ˆœ axios๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ๋งŒ ๊ฒฝํ—˜ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. React Query๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ์™œ ์จ์•ผํ•˜๋Š”์ง€? axios๋งŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๋‹ค๋ฅธ ์ ์€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

22.02.24 ์ถ”๊ฐ€
์šฐ์•„ํ•œ ํ…Œํฌ ์„ธ๋ฏธ๋‚˜์—์„œ React Query๋ฅผ ์†Œ๊ฐœํ•œ ๋‚ด์šฉ์ด ์žˆ์–ด ์ถ”๊ฐ€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

React Query

React Query๋Š” ์›น ์„œ๋น„์Šค ์š”์ฒญ์— ์˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์š”์ฒญ์€ ์—ฌ์ „ํžˆ fetch ๋˜๋Š” axios๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๊ณ , React Query๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด์˜ ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์š”์ฒญํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์š”์ฒญ์— ์˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ , ํ•„์š”ํ•œ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด ์™ธ์—๋„ React Query๋Š” ์บ์‹ฑ ๋ฐ ์žฌ์š”์ฒญ ๊ฐ™์€ ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

npm i react-query
# or
yarn add react-query

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒ์œ„์— QueryClientProvider ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

import { QueryClient, QueryClientProvider } from 'react-query';

const queryClient = new QueryClient();
  
<QueryClientProvider client={queryClient}>
  <App />
</QueryClientProvider>

React Query ์‚ฌ์šฉํ•˜๊ธฐ

useQuery ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type BlaBla = {
  text: string;
}

const { status, error, data } = useQuery<BlaBla, Error>(
  ['blabla', { id: 1 }],
  getBlaBla
);

useQuery๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๊ณ ์œ ํ•œ ํ‚ค ๊ฐ’์„ ๊ฐ–๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ์™€ ์—๋Ÿฌ์˜ ํƒ€์ž…์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • status: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ("idle", "error", "loading", "success" )
  • error: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • data: ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

useQuery Option

  • enabled: ์ž๋™์œผ๋กœ query๋ฅผ ์‹คํ–‰์‹œํ‚ฌ์ง€ ๋ง์ง€ ์—ฌ๋ถ€ (์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์‹œ ์ž๋™ ์‹คํ–‰ ๋ฐฉ์ง€)
  • select: ์„ฑ๊ณต ์‹œ ๊ฐ€์ ธ์˜จ data๋ฅผ ๊ฐ€๊ณต

์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ API๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๋•Œ

  • enabled ์˜ต์…˜์„ false๋กœ ๋‘๊ณ  refetch ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • enabled ์˜ต์…˜์— ์ด ์ „์— ์‹คํ–‰ํ–ˆ๋˜ API์˜ ์‘๋‹ต ๊ฐ’ ๋˜๋Š” ํ•„๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค.

useQuery ์‘๋‹ต ๊ฐ’์„ ์‚ฌ์šฉํ•ด action์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • useQuery onSuccess์— ์ •์˜ํ•œ๋‹ค.

Mutation

Optimistic update ?
useMutation์˜ onMutate์˜ ๊ฒฝ์šฐ Optimistic update ์ ์šฉ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
Optimistic update๋Š” API ํ˜ธ์ถœ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—, ํ˜ธ์ถœ ์ „ API๊ฐ€ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ณ  ๋ฏธ๋ฆฌ UI๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค. (API ํ˜ธ์ถœ ์‹คํŒจ ์‹œ ๋‹ค์‹œ ๋กค๋ฐฑ)

#React Query์˜ ์žฅ์ 

  • async/await ๊ตฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด useEffect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ์— ์ €์žฅํ•˜๊ณ  ์š”์ฒญํ•˜๋Š” ๋„์ค‘์— ์ปดํฌ๋„ŒํŠธ์˜ ๋งˆ์šดํŠธ๊ฐ€ ํ•ด์ œ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ํ†ตํ•ด React Query๋Š” ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • React Query๋Š” ๋‹ค์‹œ ํฌ์ปค์Šค๊ฐ€ ํ™œ์„ฑํ™” ๋˜์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (ํ•„์š”์— ๋”ฐ๋ผ ๋น„ํ™œ์„ฑํ™”๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)
  • ์š”์ฒญ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ตœ๋Œ€ 3๋ฒˆ๊นŒ์ง€ ์ž๋™์œผ๋กœ ์žฌ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

Refer

https://www.carlrippon.com/getting-started-with-react-query-and-typescript/