๐Ÿ™‹โ€โ™‚๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ fetch, then, catch [Promise] ์ดํ•ดํ•˜๊ธฐ

์†Œ์œคํ˜ธยท2021๋…„ 6์›” 2์ผ
0

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ fetch, then, catch [Promise] ์ดํ•ดํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š” TriplexLab์ž…๋‹ˆ๋‹ค.
์˜ค๋Š˜์€ Promise๊ด€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

fetchํ•จ์ˆ˜์˜ ๋™์ž‘ ํ๋ฆ„ ํ•ด์„ํ•˜๊ธฐ

fetchํ•จ์ˆ˜๋Š” Promise๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
๋‚˜์ค‘์— Promise๊ฐ์ฒด ์ƒํƒœ๊ฐ€ -> fulfilled ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ thenํ•จ์ˆ˜์—๋‹ค๊ฐ€ ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ Promise๊ฐ์ฒด ์ƒํƒœ๊ฐ€ -> fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ์ด ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์ด๊ณ ,
๊ทธ ์ž‘์—… ์„ฑ๊ณต ๊ฒฐ๊ณผ๊ฐ€ ์ฝœ๋ฐฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(response)๋กœ ๋„˜์–ด์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Promise ๊ฐ์ฒด๋Š” ์™œ ๋“ฑ์žฅํ–ˆ์„๊นŒ?

์‚ฌ์‹ค Promise ๊ฐ์ฒด๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋„ ๋น„๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
setTimeout ํ•จ์ˆ˜๋‚˜, addEventListener ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ์š”.

setTimeout(callback, milliseconds);
addEventListener(eventname, callback);

์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์ง์ ‘ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ์š”.
๋งŒ์•ฝ fetch ํ•จ์ˆ˜๋ฅผ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด

fetch('https;//first.com', callback)

fetch ํ•จ์ˆ˜๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ–ˆ์—ˆ๊ฒ ์ฃ ? ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์„ ํƒ๋˜์ง€ ์•Š๊ณ , ๊ตณ์ด Promise ๊ฐ์ฒด๋ผ๋Š” ๋ฌธ๋ฒ•์ด ๋„์ž…๋œ ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ์„ ์ง์ ‘ ๋„ฃ๋Š” ํ˜•์‹์€ ์ฝœ๋ฐฑ ํ—ฌ(callback hell)์ด๋ผ๊ณ  ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž ๊น ์ด ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค. ๋งŒ์•ฝ fetch ํ•จ์ˆ˜๊ฐ€ ์ง€๊ธˆ๊ณผ ๊ฐ™์ด Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ setTimeout ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ฝœ๋ฐฑ์„ ์ง์ ‘ ์ง‘์–ด๋„ฃ๋Š” ํ˜•์‹์˜ ํ•จ์ˆ˜์˜€๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๋•Œ

fetch('https://first.com', (response) => {
  // Do Something
  fetch('https://second.com', (response) => {
    // Do Something
    fetch('https;//third.com', (response) => {
      // Do Something
      fetch('https;//fourth.com', (response) => {
        // Do Something
      });
    });
  });
});

์ด๋Ÿฐ ์‹์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์ง€๊ธˆ fetch ํ•จ์ˆ˜ ์•ˆ์˜ ์ฝœ๋ฐฑ์— fetch ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ๊ทธ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ์•ˆ์— fetch ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ๋˜.. ๊ณ„์† ์ด๋Ÿฐ ์‹์œผ๋กœ ๋“ค์–ด๊ฐ€์žˆ์ฃ ? ๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ๋Š๋‚Œ์ด ๋“œ์‹œ๋‚˜์š”? ๋ญ”๊ฐ€ ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ๋ณต์žกํ•ด ๋ณด์ด์ฃ ? ํ•œ๋งˆ๋””๋กœ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ ์ง€๊ธˆ์€ ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•  ์ž๋ฆฌ์— "// Do Something"์ด๋ผ๋Š”์ด๋ผ๋Š” ์ฃผ์„์ด ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ๊ดœ์ฐฎ์ง€๋งŒ, ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์ฝ”๋“œ๋“ค๊นŒ์ง€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์€ ํ˜„์ €ํ•˜๊ฒŒ ๋–จ์–ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ์š”. ์ด๋Ÿฐ ํ˜„์ƒ์„ ์ฝœ๋ฐฑ ์ง€์˜ฅ ๋˜๋Š” ์ฝœ๋ฐฑ ํ—ฌ(callback hell)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ง€์˜ฅ์˜ ํ”ผ๋ผ๋ฏธ๋“œ(Pyramid of Doom)๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์› ๋˜ ๋Œ€๋กœ fetch ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์—

fetch('https://first.com')
  .then((response) => {
    // Do Something 
    return fetch('https://second.com');
  })
  .then((response) => {
    // Do Something 
    return fetch('https://third.com');
  })
  .then((response) => { 
    // Do Something 
    return fetch('https://third.com');
  });

์ด๋Ÿฐ ์‹์œผ๋กœ Promise Chaining์„ ํ•ด์„œ ์ข€ ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋กœ ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.
์ด๋ ‡๊ฒŒ Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด callback hell ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์ฝœ๋ฐฑ์„ ์ง์ ‘ ๋„ฃ๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด Promise ๊ฐ์ฒด์˜ ๋ฌธ๋ฒ•์€ ๋น„๋™๊ธฐ ์ž‘์—…์— ๊ด€ํ•œ ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ๊ฐœ๋…๋“ค์ด ๋ฐ˜์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์˜ ๋ฐฉ์‹์—์„œ๋Š” ์ฝœ๋ฐฑ์— ํ•„์š”ํ•œ ์ธ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์ด์—ˆ๋‹ค๋ฉด, Promise ๊ฐ์ฒด ๋ฌธ๋ฒ•์—๋Š” pending, fulfilled, fulfilled ์ƒํƒœ, ์ž‘์—… ์„ฑ๊ณต ๊ฒฐ๊ณผ ๋ฐ ์ž‘์—… ์‹คํŒจ ์ •๋ณด(์ด์œ ), then, catch, finally ๋ฉ”์†Œ๋“œ ๋“ฑ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ž‘์—…์— ๊ด€ํ•œ ๋ณด๋‹ค ์ •๊ตํ•œ ์„ค๊ณ„๊ฐ€ ๋ฌธ๋ฒ• ์ž์ฒด์— ๋ฐ˜์˜๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ Promise ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์€,

(1) callback hell ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ด์— ๋”ํ•ด์„œ
(2) ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ• ๋‹จ์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๊ณ ,

๊ทธ ์œ ๋ช…ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ 2015๋…„๋„ ํ‘œ์ค€์ธ ES6(=ES2015)์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ปจํ…์ธ ๋ฅผ ๋ณด๊ณ  ์‹ถ์€ ๋ถ„๋“ค์€ ๋ฐฉ๋ฌธํ•ด์„œ ๊ตฌ๊ฒฝํ•˜์„ธ์š”:)
TriplexLab Bolg ๐Ÿ˜€ ๐Ÿ˜€

profile
javascript ES6+๋ฅผ ์‚ฌ๋ž‘ํ•˜๋Š” FE๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€