React-Query๊ฐœ๋…์•Œ๊ธฐ๐ŸŒบ

์ธํŠธ๋กœ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ์ด์œ ๋งŒ ํฌ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ๋‚ด๊ฐ€ ๋ชจ๋ฅด๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์Œโ€ฆ ์ด๋Ÿด๋•Œ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ์ด ๋งž๋‚˜ ์‹ถ์Œโ€ฆ ํ์—‰ ใ…œใ…œใ…œใ…œ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•จ!

์˜ˆ์ „์— ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด ๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, NEXT.JS์—์„œ๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์ด ๋˜๊ณ , ์ฟผ๋ฆฌ๋ฅผ SSR์—์„œ ๋ณด๋‚ด๊ณ  ๋‹ค์‹œ ๋ฟŒ๋ ค์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ๋ฟŒ๋ ค์คฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด..?๋ผ๋Š” ํ‘œํ˜„์ด ๋งž์„ ์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ.. ใ…Žใ…Žใ…Ž ๊ตณ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ชผ๋žฉ ์ฅด๋ฆฌ๊ฐ€ ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ๋˜ ์‚ฌ์‹ค์ด ์žˆ์—ˆ๋‹ค.. ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์บ์‹ฑ๋˜์ง€ ์•Š๊ณ  html์„ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋งŒ๋“ค์–ด์„œ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์— ์—„์ฒญ๋‚œ ๋ถ€๋‹ด์„ ์ค€๋‹ค๋Š” ์‚ฌ์‹ค์„โ€ฆ

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ฐœ๋…๋„ ์•Œ์•„๋ณด๊ณ , ๊ฐ•์˜๋ฅผ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ˆ์ œ๋„ ๋งŒ๋“ค์–ด๋ณด๋ คํ•จ!

React-query ๐ŸŒบ


โ—ผ React-query๋ž€?

  • React-query๋ž€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ๋ฆฌ์•กํŠธ ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ค„ ์„œ๋ฒ„์˜ ๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์— ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์—…๋ฐ์ดํŠธ, ์บ์‹ฑ์„ ๋” ํšจ์œจ์ ์ด๊ณ  ํŽธํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.

๐Ÿ”น React-query์˜ ์žฅ์ 


๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒโ€ฆ ๋ฌด์Šจ ์žฅ์ ์ด ์žˆ๊ธฐ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€..

1. ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•จ

๊ทธ๋ ‡๋‹ค. ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์บ์‹ฑ์ด๋ž€ ์ปดํ“จํ„ฐ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฅผ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์บ์‹ฑ์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์œ ์ €์˜ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ €์žฅํ•ด ๋†“๊ณ , ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ์ค„์ด๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์— ๋ถ€๋‹ด์„ ๋œ ํ•ด ์ค„ ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ ๋นผ๋‚ด์„œ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ฒŒ ์ •๋ณด๋ฅผ ๋ณด์—ฌ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

2. updateํ•˜๋ฉด ์ž๋™์œผ๋กœ get์š”์ฒญ ํ•œ๋‹ค.

ํฌ์ŠคํŠธ์—์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  url์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ , ์žฌ์š”์ฒญ์„ ํ•˜๊ฑฐ๋‚˜, refresh๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๋Š” ์—…๋ฐ์ดํŠธ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

react-query๋Š” useMutationhooks ๋ฅผ ํ†ตํ•ด update๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ getํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค. ์งฑ์ด๋‹ค..

3. ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ action์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

useQuery hooks ๋ฅผํ†ตํ•ด ์„ฑ๊ณตํ–ˆ์„ ๊ฒฝ์šฐ, ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ๊ทธ์— ๋”ฐ๋ฅธ action์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‹คํŒจํ–ˆ์„ ๋•Œ toast์— error ๋ฉ”์„ธ์ง€๋ฅผ ๋‚ด๊ฑฐ๋‚˜, alret์„ ๋„์›Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์• ๋Ÿฌ๋‚˜ ๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•˜๊ฒŒ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋‹ค์‹œ get์š”์ฒญ์„ ํ•œ๋‹ค.

QueryClient์—์„œ invalidateQueries ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ๋ฌดํšจํ™” ์‹œ์ผœ ์ง€๋Šฅ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ์ž ์žฌ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉํ•œ๋‹ค.

5. useQuery๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ณ ์œ ์˜ KEY ๊ฐ’์œผ๋กœ GlobalState ๋Œ€์ฒด ๊ฐ€๋Šฅ

useQuery ์˜ ๊ณ ์œ ์˜ ํ‚ค๊ฐ’์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ง์€ ์ฆ‰์Šจ React-query๋Š” ์บ์‹ฑ์ด ๋˜์–ด ์ €์žฅ์†Œ์— ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์— ๋”ํ•ด ๊ณ ์œ ์˜ KEY๊ฐ’์œผ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑด, GlobalState๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  === React-query์˜ ์ด์ ์ด ๋œ๋‹ค.

๐Ÿ”น React-query ์‚ฌ์šฉ ๋ฐฉ๋ฒ•


React-query๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋”ฐ๋ผ Fetching , Fresh, Stale, Inactive, Delete์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Fetching : ์š”์ฒญ์ค‘์ธ ์ฟผ๋ฆฌ
  • Fresh : ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ. ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Stale : ๋งŒ๋ฃŒ๋œ ์ปค๋ฆฌ. ์žฌ์š”์ฒญํ•œ๋‹ค.
  • Inactive : ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์บ์‹œ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  • Delete : ์บ์‹œ์—์„œ ์ œ๊ฑฐ๋œ ์ฟผ๋ฆฌ

๐Ÿ”น React-query ์‚ฌ์šฉํ•˜๊ธฐ


๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ fetchํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž (๊ณตํ™ˆ ์ค‘์‹ฌ์œผ๋กœ) ๋ณธ์ธ์€ ์˜์–ด๋ฅผ ๊ต‰์žฅํžˆ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—โ€ฆ ๋ธ”๋กœ๊ทธ๋“ค๋„ ๋ด์•ผ ํ•จ.. ์šฐ์„  ๊ณตํ™ˆ์— ๋‚˜์™€์žˆ๋Š” Default ์˜ˆ์ œ๋กœ ๊ฐœ๋…์„ ์žก์•„๋ณด์ž!

โœ” Provider ์„ค์ •ํ•ด์ฃผ๊ธฐ

Context, Recoil ์ฒ˜๋Ÿผ ์ตœ์ƒ๋‹จ App.js์— QUeryProvider๋ฅผ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ props๋กœ client๋ฅผ ๋ฐ›๋Š”๋ฐ, ์ด ๊ฐ’์€ new QueryClient๋กœ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

import "./styles.css";
import Todo from  "./Todo";
import {QueryClientProvider,QueryClient} from "react-query"
export default function App() {
  const client= new QueryClient();
  return <QueryClientProvider client={client}>
    <div className="App">
      <Todo />
      </div>
  </QueryClientProvider>;
}

Context์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— Provider๋กœ ๊ฐ์‹ผ๋‹ค. props๋กœ ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค.

โœ” ์ž์‹ Component์—์„œ ํ™•์ธํ•˜๊ณ  Query ์‚ฌ์šฉํ•˜๊ธฐ

import { useQueryClient } from "react-query";
const Todo = () => {
  const queryClient= useQueryClient();
  console.log(queryClient)
  return <li>Todo List</li>;
};
export default Todo;

์ด๋ ‡๊ฒŒ ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋“ค์–ด์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ. ์ด์ œ ๋ฐ์ดํ„ฐ ํŒจ์นญํ• ๊บผ์ž„.

๋‹ค์Œํฌ์ŠคํŒ…์—์„œ..


์ถœ์ฒ˜ ๐Ÿ™๐Ÿป

์นดํ…Œ๊ณ ๋ฆฌ | TAG :

#๊ฐ„๋‹จํ•œ์‡ผํ•‘๋ชฐ   #react-query