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 »óŸ¦ ÂüÁ¶ÇÒ ¼öµµ ÀÖÀ»°Å °°Áö¸¸
±×°Ç ¾ÈµÈ´Ù. ¾ð¸¶¿îÆ® »óȲ¿¡¼´Â ¸ðµç »óŰªÀ» ½Å·ÚÇÒ ¼ö ¾ø´Ù.
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¸¦ ´·¯ »õ·Î°íħÇϸé Àá½Ã ·ÎµùÁßÀÌ º¸¿´´Ù°¡ µ¥ÀÌÅͰ¡ µé¾î¿Â´Ù. ¿äÁò ÀÎÅÍ³Ý ¼Óµµ°¡ ¿ö³« »¡¶ó ¼ø½Ä°£ÀÌ´Ù. ±×·¯³ª ¾Æ¹«¸® »¡¶óµµ
¾î´À Á¤µµÀÇ ½Ã°£Àº °É¸®¹Ç·Î ·ÎµùÁß Ç¥½Ã¸¦ »ý·«Çؼ´Â ¾ÈµÈ´Ù.