λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/React

[React] React μ—μ„œ Ajax μš”μ²­ν•˜κΈ°

by Connecting-the-dots 2022. 3. 26.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • μ΄λ²ˆμ—λŠ” GET μš”μ²­μ„ 톡해 λ°›μ•„μ˜¨ 데이터λ₯Ό 가지고 "μƒν’ˆ 더보기" λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ μƒν’ˆ λ ˆμ΄μ•„μ›ƒμ— ν•΄λ‹Ή 데이터듀이 μΆ”κ°€λ˜λ„λ‘ λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.

πŸ’œ Ajax μ•Œμ•„λ³΄κΈ°

  • Ajax λŠ” μ„œλ²„μ— μƒˆλ‘œκ³ μΉ¨ 없이 μš”μ²­μ„ ν•  수 있게 λ„μ™€μ£ΌλŠ” μΌμ’…μ˜ JavaScript μ½”λ“œμ΄λ‹€.
  • μ„œλ²„λž€ λˆ„κ΅°κ°€κ°€ νŠΉμ • URL 둜 μš”μ²­μ„ ν•˜λ©΄ 데이터λ₯Ό κ°€μ Έλ‹€μ£ΌλŠ” ν”„λ‘œκ·Έλž¨ μ •λ„λ‘œ μ΄ν•΄ν•˜λ©΄ νŽΈν•˜λ‹€.
  • μš”μ²­μ΄λž€ μ„œλ²„μ— GET, POST λ“±κ³Ό 같이 μš”μ²­ν•˜λŠ” 방법을 μ˜λ―Έν•˜λŠ”λ° 사싀 웹탐색, 둜그인, 검색 등을 GET, POST μš”μ²­μ„ 톡해 μ§„ν–‰ν•œλ‹€.
    • GET : 데이터, μ›ΉνŽ˜μ΄μ§€ 같은 것을 읽고 싢을 λ•Œ μ„œλ²„μ— λ³΄λ‚΄λŠ” μš”μ²­μ„ μ˜λ―Έν•˜λ©°, λŒ€ν‘œμ μΈ GET μš”μ²­μœΌλ‘œλŠ” λΈŒλΌμš°μ € μ£Όμ†Œμ°½μ— URL 을 μž…λ ₯ν•˜λŠ” ν–‰μœ„ 등이 μžˆλ‹€.
    • POST : 데이터λ₯Ό μ„œλ²„λ‘œ 보내고 싢을 λ•Œ μ„œλ²„μ— λ³΄λ‚΄λŠ” μš”μ²­μ„ μ˜λ―Έν•˜λ©°, λŒ€ν‘œμ μΈ POST μš”μ²­μœΌλ‘œλŠ” νŠΉμ • μ‚¬μ΄νŠΈμ—μ„œ λ‘œκ·ΈμΈν•˜λŠ” ν–‰μœ„λ‚˜ λŒ“κΈ€μ„ λ‚¨κΈ°λŠ” ν–‰μœ„ 등이 μžˆλ‹€.
  • 즉, μ›λž˜λŠ” GET, POST 와 같은 μš”μ²­μ„ ν•˜λ©΄ κ°•μ œλ‘œ νŽ˜μ΄μ§€κ°€ μƒˆλ‘œκ³ μΉ¨λ˜μ§€λ§Œ, Ajax λ₯Ό 톡해 μ΄λŸ¬ν•œ μš”μ²­λ“€μ„ μƒˆλ‘œκ³ μΉ¨ 없이 ν•  수 있게 λ˜λŠ” 것이닀.

🀍 Ajax μ‚¬μš© 방법 μ•Œμ•„λ³΄κΈ°

  • Ajax λ₯Ό μ‚¬μš©ν•˜λŠ” 방법은 λ‹€μ–‘ν•˜λ‹€.
    • jQuery Ajax λ₯Ό μ‚¬μš©ν•œλ‹€.
    • axios λ₯Ό μ„€μΉ˜ν•΄μ„œ μ‚¬μš©ν•œλ‹€.
    • JavaScript fetch() λ₯Ό μ‚¬μš©ν•œλ‹€.
  • React κ°œλ°œν™˜κ²½μ—μ„œλŠ” 주둜 axios 와 fetch() λ₯Ό 많이 μ‚¬μš©ν•œλ‹€.

🀍 Ajax μ‚¬μš©μ„ μœ„ν•΄ axios μ„€μΉ˜ν•˜κΈ°

// npm 을 μ΄μš©ν•˜λŠ” 경우
npm install axios

// yarn 을 μ΄μš©ν•˜λŠ” 경우
yarn add axios
  • μœ„μ˜ μ½”λ“œ 쀑 ν•˜λ‚˜λ₯Ό νƒν•΄μ„œ 터미널에 μž…λ ₯ν•˜λ©΄ axios κ°€ μ„€μΉ˜λœλ‹€.
import axios from 'axios';
  • axios μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 파일 μ΅œμƒλ‹¨μ— μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ import ν•΄μ€€λ‹€.

πŸ’œ "μƒν’ˆ 더보기" λ²„νŠΌ 및 κΈ°λŠ₯ λ§Œλ“€κΈ°

🀍 "μƒν’ˆ 더보기" λ²„νŠΌ UI λ§Œλ“€κΈ°

  • "μƒν’ˆ 더보기" λ²„νŠΌμ„ λ§Œλ“€μ–΄μ„œ, 이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ μƒν’ˆ 3개λ₯Ό 더 보여쀄 수 μžˆλ„λ‘ ν•΄λ³΄μ•˜λ‹€.
import axios from 'axios';

function App(){
  
  return (
    <button className="btn btn-primary">μƒν’ˆ 더보기</button>
  )
}
  • λ¨Όμ € μ λ‹Ήν•œ μœ„μΉ˜μ— μœ„μ™€ 같이 button νƒœκ·Έλ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€.

  • 그럼 μœ„μ™€ 같이 μ λ‹Ήν•œ μœ„μΉ˜μ— "μƒν’ˆ 더보기" λ²„νŠΌμ΄ 생긴닀.

🀍 "μƒν’ˆ 더보기" λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ GET μš”μ²­ν•˜λ„λ‘ ν•˜κΈ°

import axios from 'axios';

function App(){
  
  return (
    <button className="btn btn-primary" onClick={()=>{
      axios.get('https://codingapple1.github.io/shop/data2.json');
    }}>μƒν’ˆ 더보기</button>
  )
}
  • κ°•μ‚¬λ‹˜μ΄  https://codingapple1.github.io/shop/data2.json κ²½λ‘œμ— 이미 데이터λ₯Ό λ§Œλ“€μ–΄λ‘μ‹  μƒνƒœλΌ ν•΄λ‹Ή 경둜둜 GET μš”μ²­μ„ ν•΄μ£Όμ—ˆλ‹€.
import axios from 'axios';

function App(){
  
  return (
    <button className="btn btn-primary" onClick={()=>{
      axios.get('https://codingapple1.github.io/shop/data2.json')
      .then(()=>{ μš”μ²­ 성곡 μ‹œ μ‹€ν–‰ν•  μ½”λ“œ })
      .catch(()=>{ μš”μ²­ μ‹€νŒ¨ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ })
    }}>더보기</button>
  )
}
  • 이제 GET μš”μ²­μ„ 톡해 κ°€μ Έμ˜¨ 데이터λ₯Ό 좜λ ₯ν•˜κ³  μ‹ΆμœΌλ©΄ μœ„μ™€ 같이 μž‘μ„±ν•˜λ©΄ λœλ‹€.
  • .get() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°”λ‘œ 뒀에 .then() κ³Ό .catch() 와 같은 ν•¨μˆ˜λ₯Ό 연달아 뢙일 수 μžˆλ‹€.
  • 각 ν•¨μˆ˜μ—λŠ” μš”μ²­ 성곡 ν˜Ήμ€ μš”μ²­ μ‹€νŒ¨ μ‹œ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.
import axios from 'axios';

function App(){
  
  return (
    <button className="btn btn-primary" onClick={()=>{
      axios.get('https://codingapple1.github.io/shop/data2.json')
      .then((result)=>{ console.log(result.data) })
      .catch(()=>{ μš”μ²­ μ‹€νŒ¨ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ })
    }}>μƒν’ˆ 더보기</button>
  )
}
  • μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œ 데이터λ₯Ό 좜λ ₯해보고 μ‹ΆμœΌλ©΄ μœ„μ™€ 같이 .then() μ•ˆμ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ£Όλ©΄ λœλ‹€.
  • .then() μ•ˆμ˜ μ½œλ°±ν•¨μˆ˜ μ•ˆμ— νŒŒλΌλ―Έν„°(result) λ₯Ό μΆ”κ°€ν•˜μ—¬ μ½˜μ†”μ°½μ— 좜λ ₯해보면 그게 λ°”λ‘œ λ°›μ•„μ˜¨ 데이터이닀.
  • 그리고 object νƒ€μž…μ˜ 데이터λ₯Ό 확인해보면 ν•„μš”λ‘œ ν•˜λŠ” λ°μ΄ν„°λΏλ§Œ μ•„λ‹ˆλΌ μš”μ²­μ΄ μ„±κ³΅ν•œ 이유 λ“± μ—¬λŸ¬κ°€μ§€ 데이터가 λ“€μ–΄μžˆλŠ”λ° ν•„μš”ν•œ λΆ€λΆ„λ§Œ κΊΌλ‚΄μ–΄ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
    (λ‚˜λŠ” result 에 λ‹΄κΈ΄ 데이터 쀑 data λΆ€λΆ„λ§Œ ν•„μš”ν•΄μ„œ result.data 만 μ‚¬μš©ν–ˆλ‹€.)

 

  • 일반 JavaScript 문법인 fetch() 문법도 거의 λΉ„μŠ·ν•˜κ²Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • fetch(μš”μ²­ν•  URL) κ³Ό 같이 μ‚¬μš©ν•˜λ©΄ λ°”λ‘œ GET μš”μ²­μ„ ν•΄μ£Όλ©°, κ·Έ 뒀에 .then() 을 뢙일 수 μžˆλŠ” 것도 λ™μΌν•˜λ‹€.
  • 단, κ°€μ Έμ˜¨ μžλ£Œκ°€ JSON 의 ν˜•νƒœλΌλ©΄ axios λŠ” μžλ™μœΌλ‘œ object νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄μ£Όμ§€λ§Œ, fetch() λŠ” μžλ™ λ³€ν™˜μ΄ λ˜μ§€ μ•ŠλŠ”λ‹€.

🀍 GET μš”μ²­μœΌλ‘œ λ°›μ•„μ˜¨ λ°μ΄ν„°λ‘œ μƒν’ˆ λ ˆμ΄μ•„μ›ƒ 3개 μΆ”κ°€ν•˜κΈ°

  • 이제 GET μš”μ²­μœΌλ‘œ λ°›μ•„μ˜¨ λ°μ΄ν„°λ‘œ μƒν’ˆ λ ˆμ΄μ•„μ›ƒμ„ μΆ”κ°€ν•΄λ³΄μ•˜λ‹€.
  • μƒν’ˆ λ ˆμ΄μ•„μ›ƒμ€ 이미 Grid Component 와 map() ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄λ‘μ—ˆκΈ° λ•Œλ¬Έμ— shoes λΌλŠ” state μ•ˆμ— λ°›μ•„μ˜¨ 데이터λ₯Ό μΆ”κ°€λ§Œ ν•΄μ£Όλ©΄ map() ν•¨μˆ˜λ₯Ό 톡해 μƒν’ˆ λ ˆμ΄μ•„μ›ƒμ΄ μΆ”κ°€λœλ‹€.
function App() {

  let [shoes, setShoes] = useState(Data);

  return (
    <div className="App">

          <Route exact path='/'>
            <Main shoes={shoes} setShoes={setShoes} />
          </Route>

    </div>
  );
}
  • 이전에 shoes λΌλŠ” state 만 μ‚¬μš©ν•  μ˜ˆμ •μ΄μ—ˆκΈ° λ•Œλ¬Έμ— shoes λΌλŠ” state 만 shoes λΌλŠ” λ³€μˆ˜λͺ…μœΌλ‘œ μ „μ†‘λ°›μ•„μ™”λŠ”λ°, μ΄λ²ˆμ—λŠ” setShoes λΌλŠ” state 도 μ‚¬μš©ν•΄μ•Ό ν•΄μ„œ setShoes λΌλŠ” λ³€μˆ˜λͺ…μœΌλ‘œ setShoes λΌλŠ” state 도 전솑받아왔닀.
import axios from 'axios';

function App(){
  
  return (
    <button className="btn btn-primary" onClick={()=>{
      axios.get('https://codingapple1.github.io/shop/data2.json')
      .then((result)=>{
          let newData = result.data;
          props.setShoes([...props.shoes, ...newData]); 
      })
      .catch(()=>{ μš”μ²­ μ‹€νŒ¨ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ })
    }}>μƒν’ˆ 더보기</button>
  )
}
  • then() μ•ˆμ— Ajax κ°€ μ„±κ³΅ν–ˆμ„ λ•Œμ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.
  • μ΄μ „μ—λŠ” array μžλ£Œν˜•μ˜ state 에 데이터λ₯Ό μΆ”κ°€ν•  λ•Œ, 원본 array λ₯Ό λ³΅μ‚¬ν•˜μ—¬ μƒˆ λ³€μˆ˜μ— ν• λ‹Ήν•΄μ€€ λ‹€μŒ κ·Έ λ³€μˆ˜μ— μƒˆλ‘œμš΄ 데이터λ₯Ό λ„£μ–΄ state λ³€κ²½ ν•¨μˆ˜μ— λ‹΄μ•„μ£Όμ—ˆμ—ˆλ‹€.
  • μ΄λ²ˆμ—λŠ” μƒˆλ‘­κ³  덜 번거둜운 방식인 spread 문법을 ν™œμš©ν–ˆλ‹€.
  • [...props.shoes, ...newData와 같이 μž‘μ„±ν•˜λ©΄ 각 props.shoes 의 μžλ£Œμ™€ newData 의 자료의 κ΄„ν˜Έλ₯Ό 벗겨내어 데이터 ν•˜λ‚˜ν•˜λ‚˜λ₯Ό λŒ€κ΄„ν˜Έλ‘œ κ°μ‹Έμ„œ array μžλ£Œν˜•μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • μ΄λ ‡κ²Œ λ§Œλ“€λ©΄ λ³„λ„μ˜ 사본을 λ§Œλ“œλŠ” 번거둜운 κ³Όμ • 없이 νŽΈν•˜κ²Œ 데이터λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

 

728x90
λ°˜μ‘ν˜•