๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] React ์—์„œ Ajax ์š”์ฒญํ•˜๊ธฐ_2

by Connecting-the-dots 2022. 3. 26.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ๊ฐ•์‚ฌ๋‹˜์ด ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋ผ๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค.
  • ๋ฐฐ์šด ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ํ˜ผ์ž์„œ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์˜ค๋ฅ˜์—†์ด ๋งŒ๋“ค์–ด ์ถ”๊ฐ€ํ•ด์„œ ๋งค์šฐ ๋ฟŒ๋“ฏํ–ˆ๋‹ค.
    (์‚ฌ์ง„์ด ์ œ๋Œ€๋กœ ์•ˆ ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„์€ ๊ฐ•์‚ฌ๋‹˜์ด ์ œ๊ณตํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ผ์„œ ์–ด์ฉ” ์ˆ˜ ์—†์—ˆ๋‹ค...์ €๊ฑฐ๋„ ์ง์ ‘ ๊ตฌ๊ธ€๋งํ•˜๋ฉฐ ๋งŒ๋“ค๊ธฐ์—” ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ํ˜„์žฌ ์ƒˆ๋ฒฝ 5์‹œ...)
  • ์ง€๊ธˆ ๋ณด๋‹ˆ "๋กœ๋”ฉ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค." ๋ผ๋Š” ๋ฌธ๊ตฌ๋ณด๋‹ค "๋”์ด์ƒ ์ƒํ’ˆ์ด ์—†์Šต๋‹ˆ๋‹ค." ๋กœ ์ž‘์„ฑํ•  ๊ฑธ ๊ทธ๋žฌ๋‹ค. ์ˆ˜์ •ํ•ด๋‘ฌ์•ผ์ง€..

๐Ÿ’œ "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฝ๋กœ์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์™€์„œ ์ƒํ’ˆ ๋ ˆ์ด์•„์›ƒ์— ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ์ด ๊ธฐ๋Šฅ์€ ๋งŒ๋“ค๊ธฐ ์ „์— ๊ฐ•์‚ฌ๋‹˜์ด count ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค๋ฉฐ ์•ฝ๊ฐ„์˜ ํžŒํŠธ๋ฅผ ์ฃผ์…จ๋‹ค.
  • ๊ฐ•์‚ฌ๋‹˜์ด ์ œ๊ณตํ•œ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋Š” json ํŒŒ์ผ๋ช…์ด 1, 2, 3 ๊ณผ ๊ฐ™์ด ๋ชจ๋‘ ์ˆซ์ž๋กœ ๋๋‚œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
    • https://codingapple1.github.io/shop/data1.json
    • https://codingapple1.github.io/shop/data2.json
    • https://codingapple1.github.io/shop/data3.json
// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import axios from 'axios';

function App(){
  
  let [count, setCount] = useState(2);
   
  return (
    <button className="btn btn-primary" onClick={()=>{
      axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
      .then((result)=>{
      	  setCount(count+1);
          let newData = result.data;
          props.setShoes([...props.shoes, ...newData]); 
      })
      .catch(()=>{ ์š”์ฒญ ์‹คํŒจ ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ })
    }}>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>
  )
}
  • ์šฐ์„  data1.json ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ shoes ๋ผ๋Š” state ์— ๋‹ด๊ฒจ์žˆ์–ด ๋ธŒ๋ผ์šฐ์ €์ƒ ์ฒซ ์ค„์— 3๊ฐœ์˜ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋‚˜์˜ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋‚˜๋Š” data2.json ํŒŒ์ผ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ–ˆ๋‹ค.
  • ์ฆ‰, ๊ฒฝ๋กœ ๋ถ€๋ถ„์˜ data ๋’ค์— ์ˆซ์ž๊ฐ€ 2, 3 ๊ณผ ๊ฐ™์€ ์ˆœ์œผ๋กœ ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ, ๋จผ์ € useState() ๋ฅผ ํ™œ์šฉํ•˜์—ฌ count ๋ผ๋Š” state ๋ฅผ ๋งŒ๋“ค์–ด์ค€ ํ›„ ๊ฒฝ๋กœ์˜ data ๋’ค์— ${count} ๋ผ๊ณ  ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ count ๋ผ๋Š” state ์˜ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 2๋ฅผ ๋„ฃ์–ด์ค€ ๋‹ค์Œ, ์š”์ฒญ์ด ์„ฑ๊ณตํ•  ๋•Œ๋งˆ๋‹ค setCount() ์— count + 1 ํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ๋ฒ„ํŠผ์„ 1๋ฒˆ ๋ˆŒ๋ €์„ ๋•Œ๋Š” count ๊ฐ€ 2์ธ ์ƒํƒœ์—์„œ ํด๋ฆญํ•œ ๊ฒƒ์ด๋ฏ€๋กœ data2.json ์œผ๋กœ GET ์š”์ฒญ์„ ํ•˜๊ณ , ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜์—ฌ count ๊ฐ€ 3์œผ๋กœ ๋ฐ”๋€๋‹ค.
  • ๊ทธ ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ์„ 1๋ฒˆ ๋” ๋ˆ„๋ฅด๋ฉด count ๊ฐ€ 3์ธ ์ƒํƒœ์—์„œ ํด๋ฆญํ•œ ๊ฒƒ์ด๋ฏ€๋กœ data3.json ์œผ๋กœ GET ์š”์ฒญ์„ ํ•˜๊ณ , ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜์—ฌ count ๊ฐ€ 4๋กœ ๋ฐ”๋€๋‹ค.
  • ์ด๋Ÿฐ์‹์œผ๋กœ ๋งŒ์•ฝ data4.json, data5.json ... ์ด๋ผ๋Š” ๊ฒฝ๋กœ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ณ„์†ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ƒํ’ˆ ๋ ˆ์ด์•„์›ƒ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’œ ๋กœ๋”ฉ์ฐฝ UI ๋„์šฐ๊ธฐ ๋ฐ ์ˆจ๊ธฐ๊ธฐ

// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import axios from 'axios';
import styled from 'styled-components';

let Loading = styled.div`
  font-size : 20px;
  font-weight : bold;
  color: #484848;
  padding: 15px 20px;
  background : #eee;
  border-radius : 5px;
  margin : 10px 0;
`

function App(){
  
  let [load, setLoad] = useState(false); // ๋กœ๋”ฉ์ฐฝ UI ๊ธฐ๋ณธ ์ƒํƒœ๋Š” ์•ˆ ๋ณด์ด๊ฒŒ!
   
  return (
  
    {
      // ๋กœ๋”ฉ์ค‘์ผ ๋•Œ ๋กœ๋”ฉ์ฐฝ UI ๊ฐ€ ๋ณด์ด๊ณ , ์•„๋‹ ๋•Œ๋Š” ๋กœ๋”ฉ์ฐฝ UI ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.
   	  load == true ? (<Loading>๋กœ๋”ฉ์ค‘์ž…๋‹ˆ๋‹ค...</Loading>) : null
    }
          
    <button className="btn btn-primary" onClick={()=>{
      setLoad(true); // "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋กœ๋”ฉ์ฐฝ UI ๋ณด์ด๊ฒŒ!
      axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
      .then((result)=>{
          setLoad(false); // GET ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด ๋กœ๋”ฉ์ฐฝ UI ์•ˆ ๋ณด์ด๊ฒŒ!
      })
      .catch(()=>{
      	setLoad(false); // GET ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ๋กœ๋”ฉ์ฐฝ UI ์•ˆ ๋ณด์ด๊ฒŒ!
      })
    }}>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>
  )
}
  • ๋จผ์ € ๋กœ๋”ฉ์ฐฝ UI ๋ฅผ styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. 
    (styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฐฉ๋ฒ• ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ํด๋ฆญ!)
  • ๋กœ๋”ฉ์ฐฝ UI ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ณด์ด๊ฑฐ๋‚˜ ์•ˆ ๋ณด์ด๋„๋ก ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋จผ์ € useState() ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” load ๋ผ๋Š” state ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  html ํƒœ๊ทธ๋“ค ์‚ฌ์ด์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๋”ฉ์ค‘์ผ ๋•Œ ๋กœ๋”ฉ์ฐฝ UI ๊ฐ€ ๋ณด์ด๊ณ , ์•„๋‹ ๋•Œ์—๋Š” ๋กœ๋”ฉ์ฐฝ์ด ๋ณด์ด์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ ๋‹ค์Œ์œผ๋กœ "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ผ๋‹จ GET ์š”์ฒญ์„ ํ•˜๋Š” ๋™์•ˆ์€ ๋กœ๋”ฉ์ค‘์ธ ๊ฒƒ์ด๋ฏ€๋กœ ๋กœ๋”ฉ์ฐฝ UI ๊ฐ€ ๋ณด์ด๋„๋ก setLoad() ์•ˆ์— true ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • GET ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•˜๋ฉด ๋กœ๋”ฉ์€ ๋๋‚œ ๊ฒƒ์ด๋ฏ€๋กœ ๋กœ๋”ฉ์ฐฝ UI ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋„๋ก setLoad() ์•ˆ์— false ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ ๋”์ด์ƒ ๋ณด์—ฌ์ค„ ์ƒํ’ˆ์ด ์—†์„ ๋•Œ "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ ์ˆจ๊ธฐ๊ธฐ

// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import axios from 'axios';

function App(){
  let [count, setCount] = useState(2);
  let [view, setView] = useState(true);
   
  return (
          
    {
      view == true 
      ?
      (
        <button className='btn btn-primary' onClick={()=>{ 
          axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
          .then((result)=>{
            setCount(count+1);
            let newData = result.data;
            props.setShoes([...props.shoes, ...newData]);
          })
          .catch(()=>{
            setView(false);
          });
         }}>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>
      )
      : null
    }
  )
}
  • ๊ฐ•์‚ฌ๋‹˜์ด ์ œ๊ณตํ•ด์ฃผ์‹  ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋Š” data3.json ๊นŒ์ง€์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ data4.json ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— GET ์š”์ฒญ์ด ์‹คํŒจํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ .catch() ์•ˆ์— "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.
  • ๋‹ค๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ๊ณผ๋Š” ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์—†์—ˆ๋Š”๋ฐ ์ด ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋†“์€ ์ด ๋ฒ„ํŠผ ์ž์ฒด๊ฐ€ ์•ˆ๋ณด์ด๋„๋ก ํ•˜๋Š” ๊ฑฐ๋ผ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒŒ ๋งž๋‚˜ ์‹ถ์—ˆ๋‹ค.
  • ์—ฌํŠผ ๋”์ด์ƒ ๋ณด์—ฌ์ค„ ์ƒํ’ˆ์ด ์—†์„ ๋•Œ "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์„ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ์•Œ๋ฆผ์ฐฝ UI ๋ฅผ ๋งŒ๋“ค๊ณ  ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • ๋จผ์ € view ๋ผ๋Š” state ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ฒ˜์Œ์—๋Š” "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์ด ๋ณด์—ฌ์•ผ ํ•˜๋ฏ€๋กœ true ๋ผ๊ณ  ์ดˆ๊ธฐ๊ฐ’์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ ๋‹ค์Œ์œผ๋กœ GET ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์ด ๋ณด์ด์ง€ ์•Š์•„์•ผ ํ•˜๋ฏ€๋กœ catch() ์•ˆ์— setView(false) ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
{
	view == true ? (<button>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>) : null
}
  • ๊ทธ๋ฆฌ๊ณ  ์›ํ•˜๋Š” ์œ„์น˜์— ์œ„์™€ ๊ฐ™์ด ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ view ๋ผ๋Š” state ๊ฐ€ true ๋ผ๋ฉด "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์ด ๋ณด์ด๊ณ  ์•„๋‹ˆ๋ผ๋ฉด "์ƒํ’ˆ ๋”๋ณด๊ธฐ" ๋ฒ„ํŠผ์ด ๋ณด์ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ธธ๊ฒŒ ์ž‘์„ฑํ•œ button ํƒœ๊ทธ๋ฅผ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ์˜ button ํƒœ๊ทธ ์ž๋ฆฌ์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 

๐Ÿ’œ ์š”์ฒญ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋กœ๋”ฉ ์‹คํŒจ ์•Œ๋ฆผ์ฐฝ UI ๋„์šฐ๊ธฐ

// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import axios from 'axios';

let Loading = styled.div`
  font-size : 20px;
  font-weight : bold;
  color: #484848;
  padding: 15px 20px;
  background : #eee;
  border-radius : 5px;
  margin : 10px 0;
`

function Main(props) {

  let [loadFail, setLoadFail] = useState(false);

    return (

          {
            loadFail == true ? (<Loading>๋กœ๋”ฉ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.</Loading>) : null
          }
          
          <button className='btn btn-primary' onClick={()=>{ 
            axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
            .then((result)=>{
            })
            .catch(()=>{
              setLoadFail(true);
            });
           }}>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>
    )
}
  • ๋กœ๋”ฉ ์‹คํŒจ์ฐฝ UI ๋Š” styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์—ˆ๋˜ ๋กœ๋”ฉ์ฐฝ UI ๋ฅผ ์žฌํ™œ์šฉํ–ˆ๋‹ค.
    (styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฐฉ๋ฒ• ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ํด๋ฆญ!)
  • loadFail ์ด๋ผ๋Š” state ๋ฅผ ๋งŒ๋“ค์–ด์ค€ ํ›„ ์ดˆ๊ธฐ๊ฐ’์€ false ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.
  • html ์ฝ”๋“œ๋“ค ์‚ฌ์ด์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ loadFail ์ด๋ผ๋Š” state ๊ฐ€ true ๊ฐ€ ๋˜๋ฉด ๋กœ๋”ฉ ์‹คํŒจ์ฐฝ UI ๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  GET ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ๋กœ๋”ฉ์ด ์‹คํŒจํ•œ ๊ฒƒ์ด๋ฏ€๋กœ .catch() ์•ˆ์— setLoadFile(true) ๋ผ๊ณ  ์ž‘์„ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๋”ฉ ์‹คํŒจ์ฐฝ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ ๋กœ๋”ฉ ์‹คํŒจ ์•Œ๋ฆผ์ฐฝ UI ํƒ€์ด๋จธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import axios from 'axios';

let Loading = styled.div`
  font-size : 20px;
  font-weight : bold;
  color: #484848;
  padding: 15px 20px;
  background : #eee;
  border-radius : 5px;
  margin : 10px 0;
`

function Main(props) {

  let [loadFail, setLoadFail] = useState(false);
  
function failTimer(){
    setTimeout(()=>{
      setLoadFail(false);
    },2000)
    clearTimeout(failTimer);
};

    return (

          {
            loadFail == true ? (<Loading>๋กœ๋”ฉ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.</Loading>) : null
          }
          
          <button className='btn btn-primary' onClick={()=>{ 
            axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
            .then((result)=>{
            })
            .catch(()=>{
              setLoadFail(true);
              failTimer();
            });
           }}>์ƒํ’ˆ ๋”๋ณด๊ธฐ</button>
    )
}
  • ์‹ค์Šตํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ๊ธฐ๋Šฅ๋“ค์ด ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋˜ ์ฐฐ๋‚˜์— ๋กœ๋”ฉ ์‹คํŒจ์ฐฝ UI ๊ฐ€ ๊ณ„์† ๋– ์žˆ๋Š”๊ฒŒ ๊ฑฐ์Šฌ๋ ธ๋‹ค.
  • ๋งˆ์นจ useEffect() ๊ณต๋ถ€ํ•  ๋•Œ timeout() ํ•จ์ˆ˜๋„ ๋ฐฐ์› ์œผ๋‹ˆ ์ด๊ฑธ ํ™œ์šฉํ•ด์„œ ์‹คํŒจ์ฐฝ UI ๊ฐ€ 2์ดˆ ์ •๋„ ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— setLoadFile() ์„ false ๋กœ ๋งŒ๋“ค์–ด ์‚ฌ๋ผ์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™์•„์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค.
  • ๋จผ์ € failTimer() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ด ํ•จ์ˆ˜ ์•ˆ์— setTimeout() ํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ณ , setTimeout() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด setLoadFile(false) ๊ฐ€ 2000ms ํ›„์— ์‹คํ–‰๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์›์น˜ ์•Š๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก setTimeout() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ์ดํ›„์— failTimer() ๊ฐ€ ํƒ€์ด๋จธ ๊ธฐ๋Šฅ ํ•ด์ œ๊ฐ€ ๋˜๋„๋ก clearTimeout(failTimer) ๋ผ๊ณ  ์ถ”๊ฐ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ . catch() ํ•จ์ˆ˜ ์•ˆ์˜ setLoadFile(true) ๋ผ๋Š” ์ฝ”๋“œ ํ›„์— ์‹คํ–‰๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•