๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB FrontEnd/ํ”„๋ ˆ์ž„์›Œํฌ React

react-query : ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•  ๋•Œ?

ajax ์š”์ฒญํ•˜๋‹ค๋ณด๋ฉด ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์ด ๊ฐ€๋” ํ•„์š”ํ•ด์ง„๋‹ค.

- ๋ช‡์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•˜๋ ค๋ฉด?

- ์š”์ฒญ์‹คํŒจ์‹œ ๋ช‡์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์žฌ์‹œ๋„?

- ๋‹ค์Œ ํŽ˜์ด์ง€ ๋ฏธ๋ฆฌ๊ฐ€์ ธ์˜ค๊ธฐ?

- ajax ์„ฑ๊ณต/์‹คํŒจ์‹œ ๊ฐ๊ฐ ๋‹ค๋ฅธ html์„ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด?

 

1. react-query ์„ค์น˜ & ์…‹ํŒ…

(terminal)
npm install react-query
(index.js)

import { QueryClient, QueryClientProvider } from "react-query"  //1๋ฒˆ
const queryClient = new QueryClient()   //2๋ฒˆ

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <QueryClientProvider client={queryClient}>  //3๋ฒˆ
    <Provider store={store}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </Provider>
  </QueryClientProvider>
);

 

2. react-query๋กœ ajax ์š”์ฒญํ•˜๋Š” ๋ฒ•

useQuery ๋ผ๋Š”๊ฑธ ์ƒ๋‹จ์—์„œ import ํ•ด์˜จ ๋’ค์— useQuery()๋กœ ajax ์š”์ฒญ์„ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค.

function App(){
  let result = useQuery('์ž‘๋ช…', ()=>
    axios.get('https://codingapple1.github.io/userdata.json')
    .then((a)=>{ return a.data })
  )
}

 

3. react-query์˜ ์žฅ์ 

์žฅ์ 1) ajax ์š”์ฒญ ์„ฑ๊ณต/์‹คํŒจ/๋กœ๋”ฉ์ค‘ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. 

function App(){
  let result = useQuery('์ž‘๋ช…', ()=>
    axios.get('https://codingapple1.github.io/userdata.json')
    .then((a)=>{ return a.data })
  )

  return (
    <div>
      { result.isLoading && '๋กœ๋”ฉ์ค‘' }
      { result.error && '์—๋Ÿฌ๋‚จ' }
      { result.data && result.data.name }
    </div>
  )
}

result๋ผ๋Š” ๋ณ€์ˆ˜์— ajax ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•Œ์•„์„œ ์ €์žฅ๋œ๋‹ค.

- ajax์š”์ฒญ์ด ๋กœ๋”ฉ์ค‘ : result.isLoading ์ด true

- ajax์š”์ฒญ์ด ์‹คํŒจ์‹œ : result.error ๊ฐ€ true

- ajax์š”์ฒญ์ด ์„ฑ๊ณต์‹œ : result.data ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค.

 

์žฅ์ 2) ํ‹ˆ๋งŒ๋‚˜๋ฉด ์•Œ์•„์„œ ajax ์žฌ์š”์ฒญํ•ด์ค€๋‹ค. 

- ํŽ˜์ด์ง€ ์ฒด๋ฅ˜ํ•˜๊ณ ๋‚˜์„œ ์ผ์ •์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ฐฝ์œผ๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ค๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ์ด๋Ÿฐ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์— ์•Œ์•„์„œ ajax ์š”์ฒญ์„ ๋‹ค์‹œ ํ•ด์ค€๋‹ค. 

- ๋‹น์—ฐํžˆ ์žฌ์š”์ฒญ ๋„๋Š” ๋ฒ•, ์žฌ์š”์ฒญ๊ฐ„๊ฒฉ ์กฐ์ ˆํ•˜๋Š” ๋ฒ•๋„ ์žˆ๋‹ค. 

 

์žฅ์ 3) ์‹คํŒจ์‹œ ์žฌ์‹œ๋„ ์•Œ์•„์„œ ํ•ด์ค€๋‹ค.

์ž ๊น ์ธํ„ฐ๋„ท์ด ๋Š๊ฒผ๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ๊ฑฐ๋‚˜ ๊ทธ๋Ÿฌ๋ฉด ajax ์š”์ฒญ์ด ์‹คํŒจํ•œ๋‹ค. 

์‹คํŒจํ–ˆ์„ ๋•Œ๋Š” ์žฌ์‹œ๋„๋ฅผ ์•Œ์•„์„œ ํ•ด์ค€๋‹ค. 

 

์žฅ์ 4) ajax๋กœ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋Š” state ๊ณต์œ  ํ•„์š”์—†๋‹ค. 

react-query์€ server-state (DB ๋ฐ์ดํ„ฐ)๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”ํ•ด์ฃผ๋Š”๊ฑธ ๋„์™€์ค€๋‹ค.

๊ทผ๋ฐ ajax ์š”์ฒญ์„ ๋ช‡์ดˆ๋งˆ๋‹ค ๊ณ„์† ๋‚ ๋ ค์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ ์ข€ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค. 

์‹ค์‹œ๊ฐ„์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ๋ณด๋‚ด๋ ค๋ฉด ์›น์†Œ์ผ“์ด๋‚˜ Server-sent events ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹๋“ค๋„ ์žˆ๋‹ค. 

๊ทธ๋ž˜์„œ react-query๋Š” ajax ๊ด€๋ จ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์— ์˜์˜๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.