8-1.ÀÔÃâ·Â

µ¥ÀÌÅÍ ÀÔÃâ·Â

SPA À¥¾ÛÀº ÇÑ ÆäÀÌÁö³»¿¡¼­µµ ¾÷µ¥ÀÌÆ®°¡ °è¼Ó ¹ß»ýÇÑ´Ù. Æ÷ÅÐ »çÀÌÆ®ÀÇ ´º½º, ³¯¾¾, ÁÖ°¡ Á¤º¸´Â ½Ç½Ã°£À¸·Î ¹Ù²ï´Ù. ÀÌ·± µ¿ÀÛÀÌ °¡´ÉÇÏ·Á¸é ¹è°æ¿¡¼­ µ¥ÀÌÅ͸¦ °è¼Ó ¹Þ¾Æ¿Í ä¿ö ³Ö¾î¾ß ÇÑ´Ù. ÇöÀç ¿Âµµ¸¦ Ç¥½ÃÇÏ´Â ÄÄÆ÷³ÍÆ®´Â º¯È­ ¹«½ÖÇÑ ÇöÀç ³¯¾¾¸¦ ½Ç½Ã°£À¸·Î ¹Ý¿µÇÑ´Ù.

µ¥ÀÌÅ͸¦ Á¦°øÇÏ´Â ¼­¹ö¿Í Åë½ÅÀ» ¼öÇàÇÏ·Á¸é ÇÁ·ÎÅäÄÝÀÌ ÇÊ¿äÇÏ´Ù. HTTP¸¦ ¹Ù·Î ¾µ ¼öµµ ÀÖÁö¸¸ ³Ê¹« Àú¼öÁØÀ̶ó ÆíÀǼºÀÌ ¶³¾îÁø´Ù. ¿äÁòÀº ´õ °í¼öÁØÀÇ REST¸¦ »ç¿ëÇÏ¸ç ¿ì¸®³ª¶ó ±â»óûµµ REST·Î ³¯¾¾ Á¤º¸¸¦ Á¦°øÇÑ´Ù. ÀÌ ¼­ºñ½º¸¦ »ç¿ëÇÏ·Á¸é °³¹ßÀÚ µî·ÏÀ» ÇÏ°í º¹ÀâÇÑ »ç¿ë¹ýÀ» ÀÍÇô¾ß ÇÏ´Â °ï¶õÇÔÀÌ ÀÖ´Ù.

´ÙÇàÈ÷ °ø°³µÈ REST API Å×½ºÆ® »çÀÌÆ®°¡ ¸¹Àºµ¥ jsonplaceholder.typicode.com´Â users, todos, albums µîÀÇ »ùÇà µ¥ÀÌÅ͸¦ Á¦°øÇÑ´Ù. »çÁø µ¥ÀÌÅÍÀÇ 789¹ø »çÁø Á¤º¸¿¡¼­ ¾Ù¹ü ¹øÈ£¸¦ ¿Âµµ°ªÀ̶ó°í °¡Á¤ÇÏ°í °¡Á®¿Í º¸ÀÚ. »ùÇÃÀθ¸Å­ °ªÀº 16À¸·Î Á¤ÇØÁ® ÀÖÁö¸¸ ½ÇÁ¦°ªÀÌ ¹«¾ùÀ̵ç Åë½ÅÀ¸·Î Àоú´Ù´Â°Ô Áß¿äÇÏ´Ù.

¿Âµµ´Â ·£´õ¸µ ´ë»óÀ̹ǷΠtemp »óÅ·ΠÁ¤ÀÇÇ쵂 ÃʱⰪÀº ¾ÆÁ÷ Á¶»çÇϱâ ÀüÀ̶ó´Â 0À¸·Î ¼³Á¤ÇÑ´Ù. ¹öưÀ» Ŭ¸¯Çϸé ÇöÀç ¿Âµµ¸¦ Á¶»çÇØ temp »óŸ¦ °»½ÅÇÑ´Ù. µ¥ÀÌÅÍ Åë½ÅÀÇ ¿øÁ¶°ÝÀÎ XMLHttpRequest ÇÔ¼ö·Î HTTP Åë½ÅÀÇ ¼öÇàÇØ º¸ÀÚ.

 

function Weather() {

  const [temp, setTemp] = useState(0);

 

  function handleClick() {

    const xhr = new XMLHttpRequest();

    xhr.open('GET', 'https://jsonplaceholder.typicode.com/photos/789', false);

    xhr.send();

    for (const now = Date.now();Date.now() - now < 2000;) {}

    const data = JSON.parse(xhr.responseText);

    setTemp(data['albumId'])

  }

 

  return (

    <>

      <h2>ÇöÀç ¿Âµµ : {temp}</h2>

      <button onClick={handleClick}>ÇöÀç ¿Âµµ Á¶»ç</button>

    </>

  )

}

 

function App() {

  return (

    <>

      <Weather />

    </>

  );

}

 

ÇØ¿Ü ¼­¹ö¿¡ Á¢¼ÓÇØ ÀÌ °ªÀ» ÀÐ¾î ¿À´Âµ¥´Â ²Ï ½Ã°£ÀÌ °É·Á¾ß Çϴµ¥ ¿äÁò ÀÎÅͳÝÀÌ ³Ê¹« »¡¶ó ¼ø½Ä°£ÀÌ´Ù. ÁøÂ¥ ¿À·¡ ½Ã°£ÀÌ °É¸®´Â »óȲÀ» °¡Á¤Çϱâ À§ÇØ 2Ãʰ£ ¸ÛÇÏ´Ï ´ë±âÇÏ´Â Äڵ带 ³Ö¾ú´Ù. ¹ÝÀÀÀÌ ´À¸®Áö¸¸ Åë½ÅÀº Àß ¼öÇàÇÑ´Ù.

 

¿ø°ÝÁö ¼­¹ö¿¡¼­ µ¥ÀÌÅ͸¦ ¹Þ¾Æ¿Í¾ß ÇÏ´Ï ´À¸° °ÍÀº ¾î¿ ¼ö ¾øÁö¸¸ µ¥ÀÌÅ͸¦ ¹Þ´Âµ¿¾È ±â´Ù·Á¾ß ÇÑ´Ù´Â °ÍÀº ½É°¢ÇÏ´Ù. »õ·Î°íħÇÏ¿© 0µµ·Î ¸®¼ÂÇÏ°í ¹öưÀ» ´Ù½Ã ´­·¯ º¸ÀÚ. Åë½ÅÀ» ÇÏ´Â µ¿¾È¿¡´Â ¹®ÀÚ¿­À» µå·¡±×ÇØµµ ¼±ÅõÇÁö ¾Ê°í ¾ó¾î ¹ö¸° »óÅÂÀÌ´Ù.

´ÙÇàÈ÷ ºê¶ó¿ìÀú´Â ¸ÖƼ ½º·¹µå·Î µ¹°í ÀÖ¾î âÀ» À̵¿Çϰųª Å©±â¸¦ ¹Ù²Ù´Â µ¿ÀÛÀº °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ ½Ì±Û ½º·¹µå ±¸Á¶ÀÇ ¸®¾×Æ®´Â Åë½Å¿¡ ¸ÅÁøÇϰí ÀÖ¾î âÀÇ Å©±â¸¦ ¹Ù²Ù¾îµµ Á¤·ÄÀ» Á¶Á¤ÇÏÁö ¸øÇÑ´Ù. »ç½Ç XMLHttpRequest ÇÔ¼öµµ ºñµ¿±â ÀÔÃâ·ÂÀ» ¼öÇàÇÒ ¼ö ÀÖÁö¸¸ open ÇÔ¼öÀÇ ¸¶Áö¸· Àμö¸¦ false·Î ÁöÁ¤ÇÏ¿© °­Á¦·Î µ¿±âÀûÀ¸·Î µ¿ÀÛÇϵµ·Ï Çß´Ù.

ÀÌ ¿¹Á¦´Â À¥¿¡¼­ µ¿±âÀûÀΠ󸮰¡ ¾ó¸¶³ª À§ÇèÇÑÁö º¸¿©ÁØ´Ù. °ú°Å ÄÄÇ»ÅͰ¡ ´À¸± ¶§´Â »ç¿ëÀÚ°¡ Àγ»½ÉÀ» ¹ßÈÖÇÏ¿© ±â´Ù·Á ÁáÁö¸¸ ¿äÁòÀº ´Ü 1Ãʵµ ÂüÁö ¾Ê´Â´Ù. ½Ã°£ÀÌ Á» ¿À·¡ °É¸®´Â ÀÛ¾÷ÀÌ¶óµµ »ç¿ëÀÚÀÇ ¿ä±¸¿¡´Â Áï½Ã ÀÀ´äÇØ¾ß ÇÑ´Ù. Åë½ÅÀÌ ´À¸° »óȲÀ» °¡Á¤Çϱâ À§ÇØ 2Ãʰ£ ¸Û¶§¸®´Â ÄÚµå´Â Àý´ë »ç¿ëÇÏ¸é ¾ÈµÇ´Â ±Ý±â »çÇ×ÀÌ´Ù.

ºñµ¿±â ÀÔÃâ·Â

¾Õ ¿¹Á¦¿¡¼­ ºÃ´Ù½ÃÇÇ À¥¿¡¼­ÀÇ Åë½ÅÀº ¹«Á¶°Ç ºñµ¿±âÀûÀ̾î¾ß ÇÑ´Ù. ´Ü 0.1Ãʰ¡ °É¸®´õ¶óµµ ƯÁ¤ »óȲ¿¡¼­´Â ´ë±â ½Ã°£ÀÌ ¾ó¸¶³ª ´Ã¾î³¯Áö ¾Ë ¼ö ¾øÀ¸¸ç ºê¶ó¿ìÀú°¡ ¸¶Ä¡ ¾ó¾î ¹ö¸° °Íó·³ º¸À̱⠶§¹®ÀÌ´Ù. ¾î¶² ºê¶ó¿ìÀú´Â ¾Æ¿¹ µ¿±âÀûÀÎ Åë½ÅÀ» ¿¡·¯·Î Ãë±ÞÇÏ¿© ±ÝÁöÇØ ¹ö¸®±âµµ ÇÑ´Ù.

ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ¸®¾×Æ® µîÀÇ °³¹ßÃø¿¡¼­µµ È¿À²ÀûÀÎ ºñµ¿±â Åë½ÅÀ» Áö¿øÇÏ°í ÆíÀǼºÀ» ³ôÀ̱â À§ÇÑ ¾÷±×·¹À̵带 ²ÙÁØÈ÷ ÇØ ¿Ô´Ù. ±×·¯´Ù º¸´Ï ³Ê¹« ¸¹Àº ¹æ¹ýÀÌ ÀÖ¾î Çò°¥¸®´Â ¸éÀÌ ÀÖ´Ù. ¿äÁò Àß ¾È ¾²´Â ±â¹ýÀÌ¶óµµ ¿ª»çÀûÀÎ ¹ßÀü °úÁ¤À» »ìÆì º¼ ÇÊ¿ä´Â ÀÖÀ¸´Ï Çϳª¾¿ ±¸°æÇØ º¸ÀÚ.

¿øÁ¶°ÝÀÎ XMLHttpRequest ÇÔ¼ö´Â ÄÝ¹é ±â¹ÝÀ̾ ÇÔ¼ö¸¦ ³Ê¹« ¸¹ÀÌ ¸¸µé¾î¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ¾ú´Ù. ES6¿¡¼­ ºñµ¿±â µ¿ÀÛÀ» À§ÇØ Promise¸¦ µµÀÔÇϰí ÀÌ ±â¹ýÀ» »ç¿ëÇÑ fetch ÇÔ¼ö¸¦ Ãß°¡ÇÏ¿´´Ù. Àμö·Î URL°ú ¿É¼ÇÀ» Àü´ÞÇÏ¸é ºñµ¿±â ó¸® °á°úÀÎ ÇÁ¶ó¹Ì½º¸¦ Áï½Ã ¸®ÅÏÇϰí À̾îÁö´Â then, catch ¸Þ¼­µå¿¡¼­ ¼º°ø, ½ÇÆÐ½ÃÀÇ Ã³¸®¸¦ ¼öÇàÇÑ´Ù.

 

function Weather() {

  const [temp, setTemp] = useState(0);

 

  function handleClick() {

      fetch('https://jsonplaceholder.typicode.com/photos/789')

        .then(response => response.json())

        .then(data => setTemp(data['albumId']))

  }

 

  return (

    <>

      <h2>ÇöÀç ¿Âµµ : {temp}</h2>

      <button onClick={handleClick}>ÇöÀç ¿Âµµ Á¶»ç</button>

    </>

  )

}

 

function App() {

  return (

    <>

      <Weather />

    </>

  );

}

 

Äڵ尡 ±²ÀåÈ÷ ª¾ÆÁ³´Ù. fetch·Î ¿äûÀ» º¸³»°í Áï½Ã ¸®ÅÏÇ쵂 ¼º°ø½Ã ½ÇÇàÇÒ ÇÔ¼ö¸¦ then¿¡ µî·ÏÇØ µÐ´Ù. Áï½Ã ¸®ÅÏÇÑ´Ù´Â °ÍÀº ±â´Ù¸®Áö ¾Ê°í ºñµ¿±âÀûÀ¸·Î ½ÇÇàÇÑ´Ù´Â ¶æÀÌ´Ù. ÀÀ´äÀ» ¹ÞÀ¸¸é °á°ú¸¦ json °´Ã¼·Î ¹Ù²Ù°í ÀÌ °´Ã¼ÀÇ albumId¸¦ Àоî Á¤¼ö°ªÀ» »©³½´Ù. ÀÌ °ªÀ» temp »óÅ¿¡ ´ëÀÔÇϸé ÇöÀç ¿Âµµ°¡ Ãâ·ÂµÈ´Ù. º°µµÀÇ Áö¿¬ ½Ã°£À» ÁÖÁö´Â ¾Ê¾ÒÁö¸¸ ÁøÂ¥ ¿Ü±¹ ¼­¹ö±îÁö °¬´Ù¿À´Ï ¹ÝÀÀÀÌ ¾à°£ ±À¶ß´Â °ÍÀº ´À³¥ ¼ö ÀÖ´Ù.

Promise´Â ºñµ¿±â µ¿ÀÛÀ» ÈǸ¢È÷ ó¸®ÇÏÁö¸¸ thenÀÌ À̾îÁö¸é Äڵ带 ÇÑ´«¿¡ ÆÄ¾ÇÇÏ±â ¾î·Æ´Ù. ÆíÀǼºÀ» Çâ»ó½ÃŲ Á¦³Ê·¹ÀÌÅͶó´Â°É µµÀÔÇßÁö¸¸ ³­Çؾּ­ º° ÀαⰡ ¾ø¾ú´Ù. ES18¿¡¼­´Â Promise ´ë½Å ´õ Á÷°üÀûÀÎ async, await Ű¿öµå¸¦ µµÀÔÇÏ¿© ¸¶Ä¡ µ¿±âÀûÀÎ Äڵ带 ÀÛ¼ºÇϵí À§¿¡¼­ ¾Æ·¡·Î ¼ø¼­´ë·Î ÀÐÀ¸¸ç È帧À» ÆÄ¾ÇÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ ¿¹Á¦´Â async, await·Î ÀÛ¼ºÇϰí Ãß°¡ ±â´ÉÀ» ¸î °³ ´õ ³Ö¾ú´Ù. È­¸é¿¡ È¥ÀÚ ÀÖ´Ù º¸´Ï Åë½ÅÁß¿¡ ´Ù¸¥ µ¿ÀÛÀÌ °¡´ÉÇÑÁö È®ÀÎÇϱ⠾î·Á¿ö Ä«¿îÆ®¸¦ Áõ°¡ÇÏ´Â ±â´ÉÀ» ³Ö¾ú´Ù. ºñµ¿±â Ư¼ºÀ» ÃæºÐÈ÷ È®ÀÎÇÒ ¼ö ÀÖµµ·Ï 2ÃÊÀÇ ´ë±â ½Ã°£À» ³Ö¾î Åë½ÅÀÌ ¿À·¡ °É¸®´Â »óȲÀ» °¡Á¤Çß´Ù.

 

function Weather() {

  const [temp, setTemp] = useState(0);

  const [count, setCount] = useState(10);

 

  async function handleClick() {

      const response = await fetch('https://jsonplaceholder.typicode.com/photos/789');

      await new Promise(resolve => setTimeout(resolve, 2000));

      const data = await response.json();

      setTemp(data['albumId']);

  }

 

  return (

    <>

      <h2>ÇöÀç ¿Âµµ : {temp}</h2>

      <button onClick={handleClick}>ÇöÀç ¿Âµµ Á¶»ç</button>

      <p>Ä«¿îÆ® : {count} <button onClick={() => setCount(count + 1)}>Áõ°¡</button></p>

    </>

  )

}

 

function App() {

  return (

    <>

      <Weather />

    </>

  );

}

 

ÇöÀç ¿Âµµ Á¶»ç ¹öưÀ» Ŭ¸¯ÇÏ¸é ¾à 2Ãʰ£ Åë½ÅÀ» ¼öÇàÇ쵂 ¸ðµç µ¿ÀÛÀº ºñµ¿±âÀûÀ̸ç Åë½Å ½ÃÀÛ¸¸ ÇØ µÎ°í Áï½Ã ¸®ÅÏÇÑ´Ù. ±×·¡¼­ ´ë±â Áß¿¡µµ Ä«¿îÆ® Áõ°¡ ¹öưÀ» ´©¸£¸é Àß µ¿ÀÛÇϸç âÀÇ À̵¿À̳ª Å©±â º¯°æ¿¡µµ Áï½Ã ¹ÝÀÀÇÑ´Ù.

°íÀÛ 4ÁÙÂ¥¸® ÄÚµåÀÌÁö¸¸ ±²ÀåÈ÷ ¾î·Æ°Ô ´À³¢´Â »ç¶÷µµ ÀÖ´Ù. ÀÌ Äڵ尡 ¾î·Á¿ö º¸Àδٸé Promise, async, await °°Àº ÀÚ¹Ù½ºÅ©¸³Æ® ¹®¹ý¿¡ ¾ÆÁ÷ Àͼ÷ÇÏÁö ¾Ê¾Æ¼­ÀÌ´Ù. ºñµ¿±â 󸮴 ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °ú¸ñÀ̹ǷΠÇÊ¿äÇÏ´Ù¸é ¹®¹ýºÎÅÍ °øºÎÇØ¾ß ÇÑ´Ù. ÀÌ ¹®¹ýÀ» ÀÌÇØÇÏÁö ¸øÇϸé ÀÌÈÄÀÇ ¿¹Á¦¸¦ ÀÌÇØÇÏ´Â °Íµµ ½±Áö ¾Ê´Ù.

ÀÌÁßŬ¸¯ ¹æÁö

¿Âµµ Á¶»ç¸¦ ºñµ¿±âÀûÀ¸·Î ó¸®ÇÏ¿© Åë½ÅÁß¿¡µµ UI¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áõ°¡ ¹öưÀº ¾ðÁ¦µçÁö Àß µ¿ÀÛÇÑ´Ù. ¹®Á¦´Â ¸ðµç UI¸¦ ´Ù »ç¿ëÇÒ ¼ö ÀÖ´Ù º¸´Ï ¿Âµµ Á¶»çÁß¿¡µµ ¿Âµµ Á¶»ç ¹öưÀ» ¶Ç ´©¸¦ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. Àá½Ã ÈÄ °á°ú¸¦ ¹ÞÀ» ¼ö Àִµ¥ ¶È°°Àº Åë½ÅÀ» ´Ù½Ã ½ÃÀÛÇÏ´Â °ÍÀº ºÒÇÊ¿äÇÒ »Ó¸¸ ¾Æ´Ï¶ó ¶§·Î´Â À§ÇèÇϱ⵵ ÇÏ´Ù.

»ç¿ëÀÚ´Â ¼º¹Ì°¡ ±ÞÇØ °°Àº ¹öưÀ» ¿©·¯ ¹ø ´©¸£´Â °æÇâÀÌ ÀÖ´Ù. ¿Âµµ Á¶»ç´Â µÎ ¹ø ÇØµµ »ó°ü¾øÁö¸¸ °èÁ ÀÌü, Àå¹Ù±¸´Ï ´ã±â µîÀº ¿©·¯¹ø ¼öÇàÇØ¼­´Â ¾ÈµÇ´Â ¸í·ÉÀÌ´Ù. Á¶»çÁß¿¡´Â Åë½ÅÀÌ ÁøÇàÁßÀÓÀ» ¾Ë¸®°í ±× µ¿¾È¿¡´Â ÀÌ ¹öưÀ» ´©¸¦ ¼ö ¾øµµ·Ï ÇØ¾ß ÇÑ´Ù. ¹º°¡ ½ÇÇàÁßÀ̶ó´Â °Íµµ »óÅÂÀ̹ǷΠisLoading »óŸ¦ Á¤ÀÇÇϰí ÀÌ »óÅ¿¡ µû¶ó UI¸¦ Á¶ÀÛÇÑ´Ù.

 

function Weather() {

  const [temp, setTemp] = useState(0);

  const [count, setCount] = useState(10);

  const [isLoading, setIsLoading] = useState(false);

 

  async function handleClick() {

      if (isLoading) return;

      setIsLoading(true);

      try {

        const response = await fetch('https://jsonplaceholder.typicode.com/photos/789');

        await new Promise(resolve => setTimeout(resolve, 2000));

        const data = await response.json();

        setTemp(data['albumId']);

      } catch (error) {

        console.error('¿¡·¯ ¹ß»ý:', error);

      } finally {

        setIsLoading(false);

      }

  }

 

  return (

    <>

      <h2>ÇöÀç ¿Âµµ : {isLoading ? "Á¶»çÁß" : temp}</h2>

      <button onClick={handleClick} disabled={isLoading}>ÇöÀç ¿Âµµ Á¶»ç</button>

      <p>Ä«¿îÆ® : {count} <button onClick={() => setCount(count + 1)}>Áõ°¡</button></p>

    </>

  )

}

 

function App() {

  return (

    <>

      <Weather />

    </>

  );

}

 

¿Âµµ Á¶»ç ¹öưÀ» ´©¸£¸é <h2>ÀÇ ÇöÀç ¿Âµµ´Â 'Á¶»çÁß'À¸·Î ¹Ù²î¸ç ¹öưÀº »ç¿ë ±ÝÁö »óŰ¡ µÈ´Ù. Á¶»ç°¡ ³¡³ª¸é ÇöÀç°ªÀ» Ãâ·ÂÇÏ°í ¹öưÀ» ´Ù½Ã Ȱ¼ºÈ­ÇÑ´Ù.

isLoading »óÅ´ °÷°÷¿¡¼­ ÂüÁ¶ÇÑ´Ù. <h2>ÀÇ Ä¸¼Ç¿¡ Á¶°Ç ¿¬»êÀÚ¸¦ Àû¿ëÇß°í <button>ÀÇ disabled ¼Ó¼º¿¡ ´ëÀÔÇÏ¿© Á¶»çÁßÀÏ ¶§´Â »ç¿ë ±ÝÁöÀÌ´Ù. ¿Âµµ Á¶»ç ÇÔ¼ö´Â isLoadingÀÌ ÂüÀÏ ¶§ ½ÇÇàÀ» °ÅºÎÇÑ´Ù. ±×·¸Áö ¾ÊÀ» ¶§´Â Á¶»çÁßÀ¸·Î »óŸ¦ ¹Ù²Ù°í ¸ðµç Á¶»ç°¡ ³¡³ª¸é Á¶»ç ¿Ï·á »óÅ·Πº¯°æÇÑ´Ù.

Åë½ÅÀº ¾ðÁ¦³ª ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¿¹¿Ü ó¸® ±¸¹®À¸·Î °¨½Õ´Ù. ¿¹¿Ü ¹ß»ý½Ã ¿¹¿Ü »ç½ÇÀ» Äֿܼ¡ Ãâ·ÂÇߴµ¥ ½Ç¹«¿¡¼­´Â À̺¸´Ù ´õ Á¤±³ÇÑ ¿¡·¯ 󸮰¡ ÇÊ¿äÇÏ´Ù.  finally ºí·Ï¿¡ isLoadingÀ» false·Î ¹Ù²Ù´Â 󸮸¦ ÀÛ¼ºÇÏ¿© ¾î¶² °æ¿ì¶óµµ Á¶»ç´Â ³¡³»µµ·Ï Çß´Ù.

·ÎµùÁß Ç¥½Ã

»ç¿ëÀÚ°¡ ÀÏÀÏÀÌ ¹öưÀ» ´­·¯ Á¤º¸¸¦ È®ÀÎÇÏ´Â °Íº¸´Ù´Â ¾ÛÀÌ ½ÇÇà Á÷Èijª ¶Ç´Â ÁÖ±âÀûÀ¸·Î Á¶»çÇÏ´Â ¹æ½ÄÀÌ º¸ÆíÀûÀÌ´Ù. ÃʱâÈ­ ½Ã¿¡ Á¶»çÇÏ·Á¸é useEffect ÈÅ¿¡ Äڵ带 ÀÛ¼ºÇÑ´Ù. ÀÌ Á¤º¸°¡ ¾Û µ¿ÀÛ¿¡ ÇʼöÀûÀ̶ó¸é Àбâ Àü¿¡´Â ¾Æ¹« °Íµµ ÇÒ ¼ö ¾ø´Ù. ÀÌ·² ¶§´Â È­¸é¿¡ ·ÎµùÁßÀ̶ó´Â ¾È³» ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.

 

function Weather() {

  const [temp, setTemp] = useState(0);

  const [count, setCount] = useState(10);

  const [isLoading, setIsLoading] = useState(false);

 

  useEffect(() => {

    async function fetchData() {

      let isMounting = true;

      setIsLoading(true);

      try {

        const response = await fetch('https://jsonplaceholder.typicode.com/photos/789');

        await new Promise(resolve => setTimeout(resolve, 2000));

        if (isMounting) {

          const data = await response.json();

          setTemp(data['albumId']);

        }

      } catch (error) {

        console.error('¿¡·¯ ¹ß»ý:', error);

      } finally {

        setIsLoading(false);

      }

 

      return () => {

        isMounting = false;

      }

    }

    fetchData();

  }, []);

 

  return (

    <>

      {isLoading && <p>·Îµù Áß...</p>}

      {isLoading === false && (

        <>

          <h2>ÇöÀç ¿Âµµ : {temp}</h2>

          <p>Ä«¿îÆ® : {count} <button onClick={() => setCount(count + 1)}>Áõ°¡</button></p>

        </>

      )}

    </>

  )

}

 

function App() {

  return (

    <>

      <Weather />

    </>

  );

}

 

useEffect ÇÔ¼öÀÇ ¸®ÅϰªÀº Á¤¸® ÇÔ¼ö·Î Á¤ÇØÁ® ÀÖ¾î Promise¸¦ ¸®ÅÏÇÒ ¼ö ¾øÀ¸¸ç µû¶ó¼­ useEffectÀÇ Äݹé ÇÔ¼ö¸¦ async·Î Á¤ÀÇÇÒ ¼ö´Â ¾ø´Ù. ´ÙÀ½ ÄÚµå´Â ¹®¹ýÀûÀ¸·Î´Â °¡´ÉÇÏÁö¸¸ ¸®ÅÏ Å¸ÀÔÀÌ ´Þ¶ó ½ÇÇàÁß ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

 

useEffect(async () => { await .... }, [])

 

±×·¡¼­ Äݹé ÇÔ¼ö ³»¿¡ ÇÔ¼ö fetchData¸¦ Á¤ÀÇÇϰí ÀÌ ÇÔ¼ö¸¦ ºñµ¿±â·Î È£ÃâÇÏ´Â ½ÄÀ¸·Î ÀÛ¼ºÇß´Ù. ¸¶¿îÆ® ½ÃÁ¡¿¡´Â ¾Æ¹« °Íµµ º¸¿©ÁÙ°Ô ¾øÀ¸¹Ç·Î ·ÎµùÁßÀ̶ó´Â ¸Þ½ÃÁö¸¸ Ç¥½ÃÇÏ°í ¸¶¿îÆ®°¡ ¿Ï·áµÇ¸é µ¥ÀÌÅ͸¦ º¸¿© ÁØ´Ù. ´ë°³ÀÇ °æ¿ì ÀÌ ½Ã°£Àº ±ØÈ÷ ª¾Æ »ç¿ëÀÚ°¡ ¹Ìó º¸Áö ¸øÇÒ °¡´É¼ºµµ ÀÖÁö¸¸ ³×Æ®¿öÅ© ÀÔÃâ·Â ½Ã°£À» Àå´ãÇÒ ¼ö ¾øÀ¸´Ï ÀÌ Ã³¸®¸¦ »ý·«ÇÒ ¼ö´Â ¾ø´Ù.

ÀÌ ¿¹Á¦¿¡¼­ ¶Ç ÇѰ¡Áö ´«¿©°Ü º¼ °ÍÀº isMounting Áö¿ª º¯¼öÀÌ´Ù. Åë½Å Á÷Àü¿¡ true·Î ¼³Á¤Çϰí Á¤¸® ÇÔ¼ö¿¡¼­ false·Î º¯°æÇÏ¸ç µ¥ÀÌÅ͸¦ »ç¿ëÇϱâ Àü¿¡ Çѹø ´õ È®ÀÎÇÑ´Ù. ¼­¹öÀÇ ¹ÝÀÀÀÌ ´À·Á »ç¿ëÀÚ°¡ µÚ·Î°¡±â ¹öưÀ» ´­·¶À» ¶§¸¦ À§ÇÑ ¿¡·¯ ó¸®ÀÌ´Ù. ¸¶¿îÆ®Áß¿¡ ¾ð¸¶¿îÆ®°¡ ¹ß»ýÇÏ´õ¶óµµ ºñµ¿±â·Î ÁøÇàÁßÀÎ Åë½ÅÀº ¾î·°Å³ª °á°ú¸¦ ¸®ÅÏÇÑ´Ù.

À̶§ °á°ú¸¦ Ãâ·ÂÇÒ »óŰ¡ ÀÌ¹Ì »ç¶óÁ® ¹ö·È´Ù¸é ´ëÀÔÇÒ °÷µµ ¾ø°í È­¸é¿¡ Ç¥½ÃÇÒ Çʿ䵵 ¾ø´Ù. ÀÌ Ã³¸®°¡ ¾ø¾îµµ ´ë°³ÀÇ °æ¿ì´Â Å« ¹®Á¦°¡ ¾øÁö¸¸ ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. º°µµÀÇ º¯¼ö ´ë½Å isLoading »óŸ¦ ÂüÁ¶ÇÒ ¼öµµ ÀÖÀ»°Å °°Áö¸¸ ±×°Ç ¾ÈµÈ´Ù. ¾ð¸¶¿îÆ® »óȲ¿¡¼­´Â ¸ðµç »óŰªÀ» ½Å·ÚÇÒ ¼ö ¾ø´Ù.

8-2.Axios

¼Ò°³

fetch¸¸ ÇØµµ ÃæºÐÈ÷ ¾µ¸¸ÇÏÁö¸¸ ±âº» Åë½Å ±â´É¿¡¸¸ Ä¡ÁßÇÒ »Ó ÆíÀǼºÀº ³ôÁö ¾Ê´Ù. ´õ Æí¸®ÇÑ ¶óÀ̺귯¸®°¡ ¸¹ÀÌ °ø°³µÇ¾î Àִµ¥ ¸®¾×Æ® ȯ°æ¿¡¼­´Â Axios°¡ ´ëÇ¥ÀûÀÎ HTTP Ŭ¶óÀÌ¾ðÆ® ¶óÀ̺귯ÀÌ´Ù. fetch¿Í ¸¶Âù°¡Áö·Î Promise ±â¹ÝÀ̸ç async, await ¹®¹ý°ú ÇÔ²² »ç¿ëÇÑ´Ù. fetch¿¡ ºñÇØ ¸¹Àº ÆíÀÇ ±â´ÉÀ» Á¦°øÇÑ´Ù.

 

¢º ÀÎÅͼÁÅÍ·Î ¿äûÀ» º¸³»±â ÀüÀ̳ª ÀÀ´äÀ» ¹Þ±â Àü¿¡ ƯÁ¤ ·ÎÁ÷À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

¢º JSON µ¥ÀÌÅ͸¦ °´Ã¼·Î ÀÚµ¿ º¯È¯ÇÑ´Ù.

¢º ¿äûÀ» Ãë¼ÒÇϰųª ŸÀӾƿôÀ» ¼³Á¤ÇÒ ¼ö ÀÖ°í ÁøÇà·üÀ» ÃßÀûÇÒ ¼ö ÀÖ´Ù.

¢º Ŭ¶óÀ̾ðÆ®ÃøÀÇ ºê¶ó¿ìÀú¿Í ¼­¹öÃøÀÇ Node.js¿¡¼­ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¢º ±¸Çü ºê¶ó¿ìÀú±îÁö Áö¿øÇÑ´Ù.

 

Ãß°¡ ¶óÀ̺귯¸®À̹ǷΠº°µµ ¼³Ä¡°¡ ÇÊ¿äÇÏ´Ù. ÇÁ·ÎÁ§Æ®°¡ ½ÇÇàÁßÀ̶ó¸é Àá½Ã ¸ØÃß°í ´ÙÀ½ ¸í·ÉÀ¸·Î ¼³Ä¡ÇÑ´Ù.

 

C:\reactStudy\study>npm install axios

 

added 23 packages, and audited 204 packages in 2s

 

52 packages are looking for funding

  run `npm fund` for details

 

found 0 vulnerabilities

 

AxiosÀÇ ¸ðµç ±â´ÉÀ» Á¦°øÇÏ´Â ÇÔ¼ö´Â axios(config)ÀÌ´Ù. È£Ãâ Çü½ÄÀº ´Ü¼øÇÏÁö¸¸ ÀμöÀÎ config °´Ã¼¿¡ ¸â¹ö°¡ ¸¹¾Æ ¿É¼ÇÀ» ¼¼¹ÐÇÏ°Ô ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

 

¼Ó¼º

¼³¸í

url

¿äû ÁÖ¼ÒÀÌ´Ù. get, post µîÀÇ Ã¹ ¹øÂ° Àμö·Îµµ Àü´ÞµÈ´Ù.

method

HTTP ¸Þ¼­µå¸¦ ÁöÁ¤ÇÑ´Ù. get, post ¸Þ¼­µå´Â ÀÚ½ÅÀÇ ¸Þ¼­µå·Î ¼³Á¤ÇÑ´Ù. µðÆúÆ®´Â getÀÌ´Ù.

headers

HTTP Çì´õ¸¦ °´Ã¼ ÇüÅ·ΠÁöÁ¤ÇÑ´Ù. Authorization, Content-Type µîÀÇ ¸â¹ö°¡ ÀÖ´Ù.

params

Äõ¸® ¹®ÀÚ¿­·Î Àü´ÞÇÒ ¿É¼Ç °´Ã¼ÀÌ´Ù. apiKey µîÀ» ºÙÀÏ ¶§ À¯¿ëÇÏ´Ù. µðÆúÆ®´Â {}·Î ºñ¾î ÀÖ´Ù.

data

post, put µîÀÇ ¸Þ¼­µå¿¡¼­ ¿äû º»¹®À¸·Î Àü´ÞÇÒ °´Ã¼ÀÌ´Ù.

timeout

ŸÀӾƿôÀ» ms ´ÜÀ§·Î ÁöÁ¤Çϸç ÀÌ ½Ã°£µ¿¾È ÀÀ´äÀ» ¹ÞÁö ¸øÇÏ¸é ¿¡·¯ 󸮵ȴÙ. µðÆúÆ®´Â 0À̸ç Á¦ÇÑÀÌ ¾ø´Ù.

auth

HTTP ±âº» ÀÎÁõ Á¤º¸À̸ç username, password ¼Ó¼ºÀ» ÁöÁ¤ÇÑ´Ù.

responseType

ÀÀ´ä µ¥ÀÌÅÍÀÇ Æ÷¸ËÀÌ´Ù. 'json'ÀÌ µðÆúÆ®À̸ç 'text', 'blob', 'document', 'arraybuffer', 'stream' µîÀÌ ÀÖ´Ù.

baseURL

¿äûÀÇ ±âº» URLÀÌ´Ù. ¸ðµç »ó´ë °æ·Î ¿äû¾Õ¿¡ ºÙ¿©Áø´Ù. µðÆúÆ®´Â undefinedÀÌ´Ù.

transformRequest

¿äûÀ» º¸³»±â Àü¿¡ º¯È¯ÇÒ ÇÔ¼ö

transformResponse

ÀÀ´äÀ» ¹Þ¾Æ ó¸®ÇÏ´Â ÇÔ¼ö

interceptors

ÀÎÅͼÁÅÍ ¼³Á¤

responseEncoding

ÀÀ´ä µ¥ÀÌÅÍ ÀÎÄÚµùÀÌ¸ç µðÆúÆ®´Â 'utf8'ÀÌ´Ù.

parameterSerializer

Äõ¸® ½ºÆ®¸µÀ» Á÷·ÄÈ­´Â ¹æ½ÄÀ» Á¤ÀÇÇϸç (params) => { } Çü½ÄÀÇ ÇÔ¼öÀÌ´Ù. µðÆúÆ®°¡ ¹«³­ÇÏÁö¸¸ ¹è¿­À» Àü´ÞÇÏ´Â ¹æ½ÄÀÌ ¾à°£ ´Ù¸¥ °æ¿ì°¡ ÀÖ¾î ¼­¹öÀÇ ¹æ½Ä°ú ¸ÂÃâ ¶§ ÇÊ¿äÇÏ´Ù. qs.stringify(params, { arrayFormat: 'comma' } ¹è¿­À» ÄÞ¸¶·Î ±¸ºÐÇÏ¿© ³ª¿­ÇÑ´Ù.

 

¿É¼ÇÁß¿¡ ²À ÇÊ¿äÇÑ °ÍÀº url »ÓÀÌ¸ç ³ª¸ÓÁö´Â ¹«³­ÇÑ µðÆúÆ®°¡ ¼³Á¤µÇ¾î ÀÖ´Ù. ƯÁ¤ ¿É¼ÇÀ» ÀÚÁÖ »ç¿ëÇÑ´Ù¸é axios.create ¸Þ¼­µå·Î config Àμö¸¦ ÁöÁ¤ÇÏ¿© ±âº» ¼³Á¤À¸·Î ÁöÁ¤ÇÑ °´Ã¼¸¦ »ý¼ºÇϰí ÀÌ °´Ã¼·Î ¿äûÀ» º¸³»¸é »ý¼ºÇÒ ¶§ÀÇ ¼³Á¤À» ¿ì¼±ÀûÀ¸·Î »ç¿ëÇÑ´Ù.

axios ÇÔ¼ö Çϳª·Î ¸ðµç µ¿ÀÛÀ» ´Ù ó¸®ÇÒ ¼ö ÀÖÁö¸¸ ¹«³­ÇÑ ¿É¼ÇÀ¸·Î È£ÃâÇÒ ¶§´Â HTTP ¸Þ¼­µåº°·Î get, post, put, patch, delete µîÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

¢ºget(url, config) : GET ¿äûÀ» º¸³»¸ç url Àμö·Î ¿äû ÁÖ¼Ò¸¦ Àü´ÞÇÑ´Ù. config´Â ¿äû ¼³Á¤ÀÌ¸ç »ý·«½Ã µðÆúÆ® ¼³Á¤À» »ç¿ëÇÑ´Ù. delete, head, options µîµµ ¿øÇüÀº °°´Ù.

¢ºpost(url, data, config) : POST ¿äûÀ» º¸³»¸ç url¿¡ ¿äû ÁÖ¼Ò¸¦ Àü´ÞÇϰí data¿¡ ¿äû º»¹® µ¥ÀÌÅ͸¦ Àü´ÞÇÑ´Ù. °ªÀ» Àд get¿¡ ºñÇØ ¾²´Â µ¿ÀÛÀ̹ǷΠ´ë»óÀ» Àü´ÞÇØ¾ß ÇÑ´Ù. put, patchµµ ¿øÇüÀº °°´Ù.

 

ÀÀ´ä µ¥ÀÌÅÍ´Â response·Î ¹ÞÀ¸¸ç ÀÌ °´Ã¼¾È¿¡ ¼º°ø ¿©ºÎ¿Í ½ÇÁ¦ ÀÐÀº µ¥ÀÌÅÍ µîÀÇ ¿äû ó¸® °á°ú°¡ ¸ðµÎ µé¾î ÀÖ´Ù.

 

¼Ó¼º

¼³¸í

data

¼­¹ö·ÎºÎÅÍ ¹ÞÀº ÀÀ´ä º»¹®(body)ÀÌ´Ù. JSON Æ÷¸ËÀÌ¸é °´Ã¼·Î ÀÚµ¿ º¯È¯ÇØ ³õ´Â´Ù.

status

HTTP »óÅ ÄÚµåÀÌ´Ù.

statusText

»óÅ Äڵ忡 ´ëÇÑ ¼³¸í ¹®ÀÚ¿­ÀÌ´Ù.

headers

µ¥ÀÌÅÍÀÇ Å¸ÀÔ(content-type), ³¯Â¥, ¼­¹ö Á¤º¸ µîÀÌ Æ÷ÇÔµÈ ÀÀ´ä Çì´õ

config

¿äûÇÒ ¶§ º¸³½ ¿É¼ÇÀ» ±×´ë·Î ´Ù½Ã µ¹·Á ÁØ´Ù. ½ÇÆÐ½Ã Àç½ÃµµÇÒ ¶§´Â ÀÌ ¿É¼ÇÀ» Âü°íÇÑ´Ù.

request

¿äûÀ» º¸³½ °´Ã¼ÀÌ´Ù. ºê¶ó¿ìÀú ȯ°æ¿¡¼­´Â XMLHttpRequest, Node.js ȯ°æ¿¡¼­´Â ClientRequest °´Ã¼À̸ç Àú¼öÁØ Á¤º¸¸¦ È®ÀÎÇÒ ¶§ »ç¿ëÇÑ´Ù.

 

ÀԷ°ú Ãâ·ÂÀÌ ¿ö³« »ó¼¼ÇØ °¢ ¸â¹ö¸¦ Àß »ç¿ëÇϸé Á¤¹ÐÇÑ Á¦¾î°¡ °¡´ÉÇÏ°í ´Ù¾çÇÑ È¯°æ¿¡ µÎ·ç Ȱ¿ëÇÒ ¼ö ÀÖ´Ù.

»ç¿ëÀÚ ¸ñ·Ï Àбâ

´ÙÀ½ ¿¹Á¦´Â axios¸¦ Ȱ¿ëÇϾî Å×½ºÆ® ¼­¹öÀÇ »ùÇà API¸¦ È£ÃâÇÏ¿© »ç¿ëÀÚ ¸ñ·ÏÀ» Àоî Ãâ·ÂÇÑ´Ù. »ùÇà µ¥ÀÌÅÍ¿¡´Â 10¸íÀÇ »ç¿ëÀÚ°¡ µî·ÏµÇ¾î ÀÖ´Ù. fetch¿¡ ºñÇØ ¾î¶² Á¡ÀÌ ´Ù¸¥Áö Àß »ìÆìº¸ÀÚ.

 

import axios from 'axios';

 

function App() {

  const [users, setUsers] = useState([]);

  const [IsLoading, setIsLoading] = useState(true);

  const [IsError, setIsError] = useState(null);

 

  useEffect(() => {

    async function fetchUsers() {

      try {

        const response = await axios.get('https://jsonplaceholder.typicode.com/users');

        setUsers(response.data);

      } catch (e) {

        setIsError(e);

      } finally {

        setIsLoading(false);

      }

    };

 

    fetchUsers();

  }, []);

 

  if (IsLoading) {

    return <div>Loading users...</div>;

  }

 

  if (IsError) {

    return <div>Error fetching users: {IsError.message}</div>;

  }

 

  return (

    <div>

      <h2>User List</h2>

      <ul>

        {users.map(user => (

          <li key={user.id}>{user.name} - {user.email}</li>

        ))}

      </ul>

    </div>

  );

}

 

»ç¿ëÀÚ Á¤º¸ÀÇ ¸ñ·ÏÀ» Ç¥½ÃÇϱâ À§ÇØ users »óŸ¦ Á¤ÀÇÇßÀ¸¸ç ÃʱⰪÀº ºó ¹è¿­ÀÌ´Ù. ¿ø°ÝÁöÀÇ ¼­¹ö·Î ¿äûÀ» º¸³» ÀÀ´äÀ» ¹Þ´Âµ¥ ½Ã°£ÀÌ °É¸®¸ç ¿¡·¯°¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù. µÎ »óŸ¦ Ç¥½ÃÇϱâ À§ÇØ IsLoading, IsError»óŸ¦ Á¤ÀÇÇß´Ù. ·ÎµùÀÇ ÃʱⰪÀº trueÀÌ°í ¿¡·¯´Â ¾ø´Â »óÅ·ΠÃʱâÈ­ÇÑ´Ù.

useEffect ÈÅ¿¡¼­ ¸¶¿îÆ® Á÷ÈÄ axios.get ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ºñµ¿±â ¿äûÀ» º¸³½´Ù. url¸¸ Àμö·Î º¸³Â´Âµ¥ ¸Þ¼­µå±îÁö ÁöÁ¤Çؼ­ axios ÇÔ¼ö¸¦ È£ÃâÇØµµ µÈ´Ù. ÀÌ ¿ø·ÐÀûÀΠȣÃâ¿¡¼­ method¸¦ 'get'À¸·Î °íÁ¤ÇÑ ÆíÀÇ ÇÔ¼ö°¡ ¹Ù·Î getÀÌ´Ù. À¢¸¸Çϸé get, post·Î ´ëºÎºÐÀÇ Åë½ÅÀ» ¼öÇàÇÒ ¼ö ÀÖ¾î axios ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÒ ÀÏÀº °ÅÀÇ ¾ø´Ù.

 

const response = await axios.axios({

  url:'https://jsonplaceholder.typicode.com/users',

  method:'get'

});

 

ÀüüÀûÀ¸·Î´Â try, catch·Î °¨½Î ¿¡·¯¸¦ ó¸®ÇÑ´Ù. ¿¹¿Ü°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é response.data¸¦ Àдµ¥ ÀÌ´Â ÆÄ½Ì±îÁö ¿Ï·áÇÑ °´Ã¼ ¶Ç´Â °´Ã¼ ¹è¿­ÀÌ´Ù. Axios´Â ¼ö½Å µ¥ÀÌÅ͸¦ ºÐ¼®ÇÑ ÈÄ JSONÀÌ¸é ¾Ë¾Æ¼­ JSON.parse¸¦ È£ÃâÇÏ¿© °´Ã¼·Î ¹Ù²ã ³õÀ¸¹Ç·Î setUsers ÇÔ¼ö·Î ¹Ù·Î ´ëÀÔÇÒ ¼ö ÀÖ´Ù. ¿äûÈÄ »óÅ´ ±»ÀÌ Á¡°ËÇÒ ÇÊ¿ä ¾ø´Ù.

 

if (response.status === 200) { ... }

 

Axios´Â »óÅ Äڵ尡 200¹ø´ë°¡ ¾Æ´Ï¸é ±âº»ÀûÀ¸·Î ¿¡·¯·Î ó¸®ÇØ ¹ö¸®¹Ç·Î get ´ÙÀ½ ÁÙ·Î ¹«»çÈ÷ ³»·Á¿Ô´Ù´Â °ÍÀº ÀÌ¹Ì ¿¡·¯°¡ ¾Æ´Ï¶ó´Â ¶æÀÌ´Ù. fetch¿¡¼­´Â »óŸ¦ È®ÀÎÇØ¾ß ÇÏÁö¸¸ axios¿¡¼­´Â ±×·² ÇÊ¿ä ¾ø´Ù. ´Ü, 200¹ø´ë¶óµµ ¼º°ø Äڵ忡 µû¶ó 󸮸¦ ´Ù¸£°Ô ÇÒ ¶§´Â status¸¦ Àоî¾ß ÇÑ´Ù.

¿¹¿Ü°¡ ¹ß»ýÇϸé catch ºí·Ï¿¡¼­ ¿¡·¯ ó¸®Çϰí ÃÖÁ¾ÀûÀ¸·Î ·ÎµùÁßÀº Á¾·áÇÑ´Ù. ºñµ¿±â HTTP ¿äûÀÇ °¡Àå ÀϹÝÀûÀÎ ÇüÅÂÀÌ´Ù. JSX´Â ·ÎµùÁßÀ̰ųª ¿¡·¯ ¹ß»ý½ÃÀÇ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí Áï½Ã ¸®ÅÏÇÑ´Ù. ÀÀ´äÀ» Àß ¹Þ¾ÒÀ¸¸é users »óÅÂÀÇ ¹è¿­À» ¼øÈ¸Çϸç È­¸é¿¡ Ãâ·ÂÇÑ´Ù. Àá½Ã ·Îµù ¸Þ½ÃÁö°¡ º¸ÀÌ´Ù°¡ ÀÀ´äÀ» ¹ÞÀº Á÷ÈÄ¿¡ »ç¿ëÀÚ ¸ñ·ÏÀ» Ç¥½ÃÇÑ´Ù.

¿©±â±îÁö¸¸ º¸¸é µ¥ÀÌÅÍ º¯È¯ÀÌ ÀÚµ¿À̶ó´Â Á¡°ú ¿¡·¯ ó¸® ¹æ½ÄÀÌ Á» ´Ù¸£´Ù´Â °Í ¿Ü¿¡´Â fetch¿Í Å« Â÷ÀÌ´Â ¾ø°í ¼Ò½º ±æÀ̵µ ºñ½ÁÇÏ´Ù.

ÀÎÅͼÁÅÍ

ÀÎÅͼÁÅÍ(Interceptors)´Â ¿äû, ÀÀ´ä Áß°£¿¡ ³¢¾î µé¾î °øÅëÀûÀÎ ·ÎÁ÷À» ½ÇÇàÇÏ´Â ±â´ÉÀÌ´Ù. ¸ðµç È£Ãâ½Ã¸¶´Ù ¹Ýµå½Ã ÇØ¾ßÇÒ ÀÛ¾÷ÀÌ ÀÖ´Ù¸é ÀÎÅͼÁÅÍ¿¡¼­ Áß¾Ó ÁýÁßÀûÀ¸·Î ó¸®ÇÑ´Ù. ¿¹¸¦ µé¾î À¯·á ¼­ºñ½º´Â ÀÎÁõ ÅäÅ«À» º¸³»¾ß Çϴµ¥ ÀÌ·± 󸮸¦ ÀÎÅͼÁÅÍ¿¡¼­ ÇÏ¸é °³º° È£ÃâÀº ÀÎÁõ¿¡ ´ëÇØ ´õ ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù.

¿©·¯ ÀÎÅͼÁÅ͸¦ µî·ÏÇÒ ¼ö ÀÖÀ¸¸ç µî·Ï ¼ø¼­´ë·Î ½ÇÇàÇÑ´Ù. Axios¸¦ »ç¿ëÇÏ´Â °¡Àå Å« ÀÌÀ¯°¡ ¹Ù·Î ÀÎÅͼÁÅÍÀÌ´Ù. ÀÎÅͼÁÅÍ´Â ¿äû°ú ÀÀ´ä µÎ °¡Áö Á¾·ù°¡ ÀÖ´Ù. ¿äû ÀÎÅͼÁÅÍ´Â º¸³»±â Àü¿¡ ½ÇÇàÇÑ´Ù. use ¸Þ¼­µå´Â ¼º°ø½Ã¿Í ¿¡·¯½Ã¿¡ È£ÃâÇÒ µÎ °³ÀÇ ÄݹéÀ» Àμö·Î ¹Þ´Â´Ù. ¼º°ø Äݹ鿡¼­ configÀ» ¼öÁ¤ÇÒ ¼ö Àִµ¥ ÇÁ·ÎÁ§Æ® Àü¿ªÀûÀ¸·Î »ç¿ëÇÏ´Â ¼³Á¤ÀÌ ÀÖ´Ù¸é ¿©±â¼­ Àû¿ëÇÑ´Ù.

ÀÀ´ä ÀÎÅͼÁÅÍ´Â ÀÀ´äÀ» ¹ÞÀº ÈÄ¿¡ ½ÇÇàÇÑ´Ù. ÀÀ´ä µ¥ÀÌÅ͸¦ º¯È¯Çϰųª ƯÁ¤ »óÅ¿¡ ´ëÇÑ ¿¡·¯ 󸮸¦ ¼öÇàÇÑ´Ù. ¾Õ ¿¹Á¦¿¡¼­ ¿äûÀ» º¸³»±âÀü¿¡ ÀÎÅͼÁÅ͸¦ ¼³Ä¡ÇÏ´Â Äڵ带 Ãß°¡ÇÑ´Ù. ¿äû½Ã ·Î±×¸¦ ³²±â°í ÀÀ´ä µ¥ÀÌÅÍÀÇ »ç¿ëÀÚ À̸§À» ¸ðµÎ ´ë¹®ÀÚ·Î ¹Ù²Û´Ù.

 

  useEffect(() => {

    async function fetchUsers() {

      try {

        // ¿äû ÀÎÅͼÁÅÍ

        axios.interceptors.request.use(

          (config) => {

            console.log('¿äû º¸³¿' + config.url)

            // config¸¦ Á¡°ËÇÏ°í ¼öÁ¤ÇÏ¿© ¸®ÅÏÇÑ´Ù.

            return config;

            // ¶Ç´Â Promise¸¦ ¸®ÅÏÇÏ¿© ¿äûÀ» Áö¿¬ÇÑ´Ù.

          },

          (error) => {

            console.log('¿¡·¯ ¹ß»ý')

            // Promise¸¦ °ÅºÎÇÏ¿© ´ÙÀ½ ¿¡·¯ Çڵ鷯·Î Àü´Þ

            return Promise.reject(error);

          }

        )

 

        // ÀÀ´ä ÀÎÅͼÁÅÍ

        axios.interceptors.response.use(

          (response) => {

            console.log('ÀÀ´ä ¹ÞÀ½' + response.data)

            // ÀÀ´äÀ» ¼öÁ¤ÇÏ¿© ¸®ÅÏÇÑ´Ù.

            response.data = response.data.map(user => ({

              ...user,

              name:user.name.toUpperCase()

            }))

            return response;

            // ¶Ç´Â Promise¸¦ ¸®ÅÏÇÏ¿© ¿äûÀ» Áö¿¬ÇÑ´Ù.

          },

          (error) => {

            console.log('¿¡·¯ ¹ß»ý')

            // Promise¸¦ °ÅºÎÇÏ¿© ´ÙÀ½ ¿¡·¯ Çڵ鷯·Î Àü´Þ

            return Promise.reject(error);

          }

        )

 

        const response = await axios.get('https://jsonplaceholder.typicode.com/users');

        ....

 

ÀÀ´ä °´Ã¼ÀÇ data´Â userÀÇ ¹è¿­À̸ç mapÀ¸·Î ¼øÈ¸Çϸç name¸¸ ´ë¹®ÀÚ·Î ¹Ù²Û´Ù. ÀÀ´ä °á°ú¸¦ Àϰý Æ÷¸ËÆÃÇϰųª ƯÁ¤ Á¤º¸¸¦ ÇÊÅ͸µÇÏ´Â µîÀÇ ÈÄ¼Ó Ã³¸®µµ °¡´ÉÇÏ´Ù.

¿äûÀ» º¸³»±â ÀüÀ̳ª ¹Þ±â Àü¿¡ ¿øÇÏ´Â ¸ðµç °ÍÀ» ó¸®ÇÒ ¼ö ÀÖ¾î Åë½ÅÀ» ¿øÇϴ´ë·Î Á¶ÀÛÇÒ ¼ö ÀÖ´Ù.

Àüü ´ë±â

À¥ ÆäÀÌÁö´Â ¿©·¯ °³ÀÇ ÄÄÆ÷³ÍÆ®·Î ±¸¼ºµÈ´Ù. ÄÄÆ÷³ÍÆ®³¢¸®´Â µ¶¸³ÀûÀÌ¶ó °³º°ÀûÀ¸·Î ºñµ¿±â Åë½ÅÀ» ¼öÇàÇØµµ µÇÁö¸¸ ¸ðµç µ¥ÀÌÅͰ¡ ¿ÏÀüÈ÷ µé¾î¿Í¾ß ½ÃÀÛÇÒ ¼ö ÀÖ´Â °æ¿ìµµ ÀÖ´Ù. ÀÌ·² ¶§´Â °¢ µ¥ÀÌÅ͸¦ ¹Þ´Â ÇÔ¼ö¸¦ ºñµ¿±â·Î ÀÛ¼ºÇϰí Promise.all ¸Þ¼­µå·Î Àüü ´ë±âÇÑ´Ù. ´ÙÀ½ ¿¡Á¦´Â »ùÇÿ¡¼­ »ç¿ëÀÚ, ÇÒÀϸñ·Ï, °Ô½Ã±Û µîÀÇ µ¥ÀÌÅ͸¦ ÇѲ¨¹ø¿¡ ÀÐ¾î µéÀδÙ.

 

import axios from 'axios';

 

function App() {

  const [users, setUsers] = useState(0);

  const [todos, setTodos] = useState(0);

  const [posts, setPosts] = useState(0);

  const [IsLoading, setIsLoading] = useState(true);

 

  useEffect(() => {

    async function fetchUsers() {

      return await axios.get('https://jsonplaceholder.typicode.com/users');

    };

 

    async function fetchTodos() {

      return  await axios.get('https://jsonplaceholder.typicode.com/todos');

    };

 

    async function fetchPosts() {

      return  await axios.get('https://jsonplaceholder.typicode.com/posts');

    };

 

    async function init() {

      Promise.all([

        fetchUsers(),

        fetchTodos(),

        fetchPosts()

      ])

      .then(res => {

        setUsers(res[0].data.length);

        setTodos(res[1].data.length);

        setPosts(res[2].data.length);

        setIsLoading(false);

      })

    }

 

    init();

  }, []);

 

  if (IsLoading) {

    return <div>·Îµù Áß...</div>;

  }

 

  return (

    <div>

      <h2>ÃʱâÈ­ ¿Ï·á</h2>

      <p>User : {users}, Todo : {todos}, Post : {posts}</p>

    </div>

  );

}

 

°¢ ¿äûÀ» ºñµ¿±â ÇÔ¼ö·Î ÀÛ¼ºÇϰí init¿¡¼­ ¸ðµç ¿äûÀÌ ¼º°øÇÒ ¶§±îÁö ±â´Ù¸°´Ù. ÀÌ ¶§´Â isLoadingÀÌ trueÀ̹ǷΠȭ¸é¿¡ ·ÎµùÁß... ¸Þ½ÃÁö¸¸ Ãâ·ÂµÈ´Ù. ¸ðµç ¿äûÀÌ ´Ù ¼º°øÇßÀ» ¶§ then¿¡¼­ ÀÀ´ä °´Ã¼ ¹è¿­ÀÇ °ªÀ» ÃßÃâÇÏ¿© °¢ »óÅ¿¡ ´ëÀÔÇÑ´Ù. ¸ðµç µ¥ÀÌÅ͸¦ ´Ù ¹Þ¾ÒÁö¸¸ ÆíÀÇ»ó µ¥ÀÌÅÍ °³¼ö¸¸ Ãâ·ÂÇÏ¿© È®Àθ¸ Çß´Ù.

F5¸¦ ´­·¯ »õ·Î°íħÇϸé Àá½Ã ·ÎµùÁßÀÌ º¸¿´´Ù°¡ µ¥ÀÌÅͰ¡ µé¾î¿Â´Ù. ¿äÁò ÀÎÅÍ³Ý ¼Óµµ°¡ ¿ö³« »¡¶ó ¼ø½Ä°£ÀÌ´Ù. ±×·¯³ª ¾Æ¹«¸® »¡¶óµµ ¾î´À Á¤µµÀÇ ½Ã°£Àº °É¸®¹Ç·Î ·ÎµùÁß Ç¥½Ã¸¦ »ý·«Çؼ­´Â ¾ÈµÈ´Ù.