Language/JavaScript

๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Async/Await ๊ฐœ๋… & ๋ฌธ๋ฒ• ์ •๋ณต

์ธํŒŒ_ 2021. 9. 26. 17:09

js-async-await

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ 3๊ฐ€์ง€ ๋ฐฉ์‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์ž์ฃผ ์“ฐ์ธ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋™์ž‘๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์–ธ์ œ ๋ฐ˜ํ™˜๋ ์ง€ ์•Œ์ˆ˜ ์—†์–ด, ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜(Callback) ์™€ ์ด๋ฅผ ๊ฐœ์„ ํ•œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด(Promise)๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ฅผ Callback Hell, Promise Hell ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šด๋‹ค.

/* Callback Hell */
getData (function (x) {
  getMoreData (x, function (y) {
    getMoreData (y, function (z) {
      ...
    });
  });
});
/* Promise Hell */
fetch('https://example.com/api')
  .then(response => response.json())
  .then(data => fetch(`https://example.com/api/${data.id}`))
  .then(response => response.json())
  .then(data => fetch(`https://example.com/api/${data.id}/details`))
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฝœ๋ฐฑ ํ—ฌ์€ ์ฝ”๋“œ๊ฐ€ ํ™œ์ฒ˜๋Ÿผ ๊ตฝ์–ด ๋ณด๊ธฐ๊ฐ€ ์—‰์„ฑํ•ด์ง€๊ณ , ํ”„๋กœ๋ฏธ์Šค ํ—ฌ๋„ ์ง€๋‚˜์นœ then ํ•ธ๋“ค๋Ÿฌ ๋‚จ์šฉ์œผ๋กœ ์ธํ•ด ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ์˜๋„๋ฅผ ํ•œ๋ฒˆ์— ํŒŒ์•…ํ• ์ˆ˜๊ฐ€ ์—†๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ async ์™€ await ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•˜์˜€์œผ๋ฉฐ, ๋ฌธ๋ฒ•์— ์žˆ์–ด์„œ๋„ ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์ ธ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ ์‹œ์ผœ์ค€๋‹ค.

async function getData() {
    const response = await fetch('https://example.com/api');
    const data = await response.json();
    const response2 = await fetch(`https://example.com/api/${data.id}`);
    const data2 = await response2.json();
    const response3 = await fetch(`https://example.com/api/${data.id}/details`);
    const data3 = await response3.json();
    console.log(data3);
}

getData();

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฝœ๋ฐฑ ํ—ฌ๊ณผ ๊ฐ™์€ ํ—ˆ๋ฆฌ ๊ตฝ์€ ์ฝ”๋“œ๋Š” ์—†์œผ๋ฉฐ, ํ”„๋กœ๋ฏธ์Šค ํ—ฌ๊ณผ ๊ฐ™์€ ์ง€๋‚˜์นœ then ํ•ธ๋“ค๋Ÿฌ ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ๊ฐ€๋…์„ฑ ํ•˜ํ–ฅ๋„ ์—†๋‹ค. ๋งˆ์น˜ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ›๋Š” ์ •์˜๋ฌธ ํ˜•์‹๋Œ€๋กœ ๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋ฅผ ๋™์ผ ์ฝ”๋“œ ๋ ˆ๋ฒจ ๋ผ์ธ์—์„œ ์•Œ์ˆ˜๊ฐ€ ์žˆ์–ด ํ›จ์”ฌ ํŽธํ•˜๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ async / await

async/await๋Š” ES2017์— ๋„์ž…๋œ ๋ฌธ๋ฒ•์œผ๋กœ์„œ, Promise ๋กœ์ง์„ ๋” ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์œ ์˜ํ•ด์•ผ ํ•  ์ ์ด async/await๊ฐ€ Promise๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ Promise๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‹จ์ง€ ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„์„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฒŒ ํŽธํ•˜๊ฒŒ ๋ณด์ด๋Š” ๋ฌธ๋ฒ•๋งŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ค„ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. 

๋งˆ์น˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ prototype๊ณผ class ๋ฌธ๋ฒ•์˜ ์ฐจ์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž๋ฐ”์™€ ๊ฐ™์ด ํด๋ž˜์Šค ํ˜•์‹์˜ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋”๋ผ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ ํ”„๋กœํ† ํƒ€์ž… ํ˜•์‹์œผ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ์„ ์ฒ˜๋ฆฌํ•˜๋“ฏ์ด, async/await๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํ”„๋กœ๋ฏธ์Šค ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ๋ฌธ๋ฒ• ํ˜•ํƒœ๋งŒ ์ข€ ๋” ๊ฐ„ํŽธํ•œ ์Šคํƒ€์ผ๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

async / await ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

async ์™€ await ๋Š” ์ ˆ์ฐจ์  ์–ธ์–ด์—์„œ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋ฒ•๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค. function ํ‚ค์›Œ๋“œ ์•ž์— async ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ณ , ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await ๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

๋‹ค์Œ์€ setTimeout ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด delay ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๊ธฐ์กด Promise.then() ๋ฐฉ์‹๊ณผ async/await ๋ฐฉ์‹์œผ๋กœ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ด๋‹ค.

// ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋ฐ˜ํ™˜ ํ•จ์ˆ˜
function delay(ms) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`${ms} ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.`);
      resolve()
    }, ms);
  });
}
// ๊ธฐ์กด Promise.then() ํ˜•์‹
function main() {
  delay(1000)
      .then(() => {
        return delay(2000);
      })
      .then(() => {
        return Promise.resolve('๋');
      })
      .then(result => {
        console.log(result);
      });
}

// ๋ฉ”์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ
main();
// async/await ๋ฐฉ์‹
async function main() {
  await delay(1000);
  await delay(2000);
  const result = await Promise.resolve('๋');
  console.log(result);
}

// ๋ฉ”์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ
main();

์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด promise๋Š” then ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€๋งŒ, async/await๋Š” await ํ‚ค์›Œ๋“œ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. async/await์˜ ์žฅ์ ์€ ๋น„๋™๊ธฐ์  ์ ‘๊ทผ๋ฐฉ์‹์„ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๋ฉฐ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ ธ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.


async ํ‚ค์›Œ๋“œ

async ํ‚ค์›Œ๋“œ๋Š” ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•  ํ•„์š”์—†์ด await๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ๋ฌธ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰, function ์•ž์— async์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ, ํ•จ์ˆ˜๋‚ด์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ async function ์ •์˜๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ง๊ณผ ๊ฐ™๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ์‹
async function func1() {
    const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
}
func1();

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
const func2 = async () => {
    const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
}
func2();

 

async ๋ฆฌํ„ด๊ฐ’์€ Promise ๊ฐ์ฒด

์ด๋ ‡๊ฒŒ async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ function์—์„œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

async function func1() {
  return 1;
}

const data = func1();
console.log(data); // ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค

js-async

๋‹จ์ˆœ ์ •์ˆ˜ 1์„ ๋ฆฌํ„ดํ–ˆ์Œ์—๋„ ์œ„ ๊ฒฐ๊ณผ์—์„œ ๋ณด๋“ฏ์ด, ์ดํ–‰(fulfilled) ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋จ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด async function์—์„œ ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋“  ๋ฌด์กฐ๊ฑด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์ ธ ๋ฐ˜ํ™˜ ๋œ๋‹ค๋Š” ํŠน์ง•์„ ์•Œ ์ˆ˜ ๊ฐ€ ์žˆ๋‹ค.

 

๋‹ค๋ฅธ Promise ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ

๋ฌผ๋ก  ์ง์ ‘ ํ”„๋กœ๋ฏธ์Šค ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ(state)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

async function resolveP() {
  return Promise.resolve(2);
}

async function rejectP() {
  return Promise.reject(2);
}

js-async

reject ๊ฐ™์€ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด Promise.reject() ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ๋ฅผ ์‹คํŒจ(rejected) ์ƒํƒœ๋กœ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ, async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ throw ๋ฅผ ํ•ด๋„ ์‹คํŒจ ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ฒŒ ๋œ๋‹ค.

async function errorFunc() {
    throw new Error("ํ”„๋กœ๋ฏธ์Šค reject ๋ฐœ์ƒ์‹œํ‚ด");
}

js-async

๋งŒ์ผ async function์—์„œ ์ผ๋ถ€๋Ÿฌ return์„ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ return undefiend ์œผ๋กœ ์ฒ˜๋ฆฌ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฐŒ๋ซ๋“  ๋ฌด์กฐ๊ฑด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค

js-async

 

async ํ•จ์ˆ˜์™€ then ํ•ธ๋“ค๋Ÿฌ

๋งŽ์€ ์ƒˆ๋‚ด๊ธฐ๋“ค์ด ์˜ค๋กœํžˆ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์—๋งŒ then ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์œ„์—์„œ ๋ฐฐ์› ๋“ฏ์ด async ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์€ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— async ํ•จ์ˆ˜ ์ž์ฒด์— then ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ผ์ˆ˜๋„ ์žˆ๋‹ค.

async function func1() {
  return 1;
}

func1()
	.then(data => console.log(data));

๋‹ค๋งŒ then ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ ๋ฐฉ์‹์€ ๋‚จ์šฉํ•  ๊ฒฝ์šฐ Promise Hell์— ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹ ์— await ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.


await ํ‚ค์›Œ๋“œ

await ํ‚ค์›Œ๋“œ๋Š” promise.then() ๋ณด๋‹ค ์ข€ ๋” ์„ธ๋ จ๋˜๊ฒŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” fetch() ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด then ํ•ธ๋“ค๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด ์‚ฌ์šฉํ•ด์™”์„ ๊ฒƒ์ด๋‹ค.

// then ํ•ธ๋“ค๋Ÿฌ ๋ฐฉ์‹
fetch(url)
    .then(res => res.json()) // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
    .then(data => {
      // data ์ฒ˜๋ฆฌ
      console.log(data);
    })

await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด then ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์ด, ์‹ฌํ”Œํ•˜๊ฒŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์™ผ์ชฝ์— await ๋งŒ ๋ช…์‹œํ•ด์ฃผ๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋ฐ›๋„๋ก ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๋ฉด ๋์ด๋‹ค. then๊ณผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋‚จ๋ฐœํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊นŠ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ํ•œ ์ค„ ๋ ˆ๋ฒจ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

// await ๋ฐฉ์‹
async function func() {
    const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
    // data ์ฒ˜๋ฆฌ
    console.log(data);
}
func();

 

await๋Š” Promise ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ

await๋Š” ํ‚ค์›Œ๋“œ ์ด๋ฆ„์—์„œ ๋ณด๋“ฏ์ด Promise ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ ์ฝ”๋“œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  wait ํ•œ๋‹ค๋ผ๋Š” ๋œป์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด fetch() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ํ•จ์ˆ˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด Promise๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ , Promise๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ์‹์ด๋‹ค.

async function getData() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
  const data = await response.json();
  console.log(data):
}

์œ„ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด getData() async ํ•จ์ˆ˜ ๋‚ด์—์„œ fetch() ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ˜ํ™˜๋œ Promise๋ฅผ await ํ‚ค์›Œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•จ์ˆ˜ ๋‚ด ์ฝ”๋“œ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ , fetch() ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™€ fetch() ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ๋ฐ”๋กœ ๋‹ค์Œ response.json() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ Promise๋ฅผ ๋‹ค์‹œ await๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ฝ”๋“œ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™€์ง€๋ฉด ์ตœ์ข… ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  ๋”ฐ๋ผ์„œ await๋Š” Promise๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ, ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

async/await ์—๋Ÿฌ ์ฒ˜๋ฆฌ

๊ธฐ์กด์˜ Promise.then() ๋ฐฉ์‹์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” catch() ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ค‘๊ฐ„ ์ค‘๊ฐ„์— ๋ช…์‹œํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์•ผ๋งŒ ํ–ˆ๋‹ค.

// then ํ•ธ๋“ค๋Ÿฌ ๋ฐฉ์‹
function fetchResource(url) {
  fetch(url)
    .then(res => res.json()) // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
    .then(data => {
      // data ์ฒ˜๋ฆฌ
      console.log(data);
    })
    .catch(err => {
      // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
      console.error(err);
    });
}

์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„   try/catch ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์™”๋‹ค. async/await๋„ ์ด์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๋ฉด ๊ณ ๋Œ€๋กœ try/catch๋ฌธ์„ ์”Œ์šฐ๋ฉด ๋˜๊ฒŒ ๋œ๋‹ค.

// async/await ๋ฐฉ์‹
async function func() {

    try {
        const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
        const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
        // data ์ฒ˜๋ฆฌ
        console.log(data);
    } catch (err) {
        // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
        console.error(err);
    }

}
func();

์ด์ฒ˜๋Ÿผ async/await์˜ ์žฅ์ ์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฝํžˆ๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ณ  ์ฝ์–ด ๋‚ด๋ฆฌ๋“ฏ์ด ๋ง์ด๋‹ค. 


async / await ํ•จ์ •๊ณผ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์›น์—์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์‹œ๊ฐ„ ์†Œ๋ชจ์ ์ธ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›น ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ Promise์™€ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await๋ฅผ ๊นŠ์€ ์ดํ•ด ์—†์ด ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. await ์ž์ฒด๊ฐ€ Promise๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋ฉ€ํ‹ฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์–ต์ง€๋กœ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์˜คํžˆ๋ ค 2์ดˆ๋งŒ์— ํ•ด๊ฒฐํ•  ๋กœ์ง์„ 6์ดˆ์”ฉ์ด๋‚˜ ๊ฑธ๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ await๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ await ๋‚จ์šฉ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ ์‚ฌํ•ญ๊ณผ Promise.all์„ ํ†ตํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

์ ์ ˆํ•˜์ง€ ์•Š์€ async/await ์‚ฌ์šฉ

์•„๋ž˜ ์ฝ”๋“œ๋Š” Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๊ณผ์ผ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๊ณผ์ผ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋‹ค.

์šฐ์„ , getApple() ํ•จ์ˆ˜๋Š” "apple"์ด๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ์œ„ํ•ด 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, getBanana() ํ•จ์ˆ˜๋Š” 1์ดˆ ํ›„์— "banana"๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

function getApple(){
  return new Promise( (resolve, reject) => {
    setTimeout(() => resolve("apple"), 1000);
  })
}

function getBanana(){
  return new Promise( (resolve, reject) => {
    setTimeout(() => resolve("banana"), 1000);
  })
}

์ด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด async/await ํ˜•์‹์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

async function getFruites(){
  let a = await getApple(); 
  let b = await getBanana(); 
  console.log(`${a} and ${b}`);
}

getFruites();

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค. ์šฐ์„  ์‚ฌ๊ณผ์™€ ๋ฐ”๋‚˜๋‚˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getApple() ์™€ getBanana() ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์„œ๋กœ ์—ฐ๊ด€์ด ์—†๋‹ค. ์ฆ‰, ์‚ฌ๊ณผ๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์™€๋„ ๋˜๊ณ  ๋ฐ”๋‚˜๋‚˜๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์™€๋„ ๋œ๋‹ค. ์ด๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค๋ผ๋ฉด 1์ดˆ๋ฅผ ์•„์ฃผ์•„์ฃผ ์•ฝ๊ฐ„ ๋„˜๊ธฐ๋Š” ์ˆ˜์ค€์œผ๋กœ ์•ฝ 1์ดˆ ์•ˆ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋งž์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ƒ๊ฐ์—†์ด await ํ‚ค์›Œ๋“œ๋ฅผ ๋‘๋ฒˆ ๋ถ™์ž„์œผ๋กœ์จ ๋‘ ๊ณผ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ์œผ๋กœ์จ ์ด 2์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. ์‹œ๊ฐ„ ๋‚ญ๋น„์ธ ์…ˆ์ด๋‹ค. ์ด๋ฅผ console.time() ์„ ํ†ตํ•ด ์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์‹คํ–‰ํžˆ๊ฐ„์„ ๊ตฌํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด 2์ดˆ๊ฐ€ ์กฐ๊ธˆ ๋„˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

async function getFruites(){
  console.time();
  let a = await getApple(); // 1์ดˆ ์†Œ์š”
  let b = await getBanana(); // 1์ดˆ ์†Œ์š”
  console.log(`${a} and ${b}`);
  console.timeEnd();
}

getFruites();

async-await

 

์ ์ ˆํ•œ async/await ์‚ฌ์šฉ

await ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋ฉด ๋น„๋™๊ธฐ๊ฐ€ ๊ฐ•์ œ์ ์œผ๋กœ ๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ '๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ 'ํ•œ๋‹ค๋Š” ๊ฒƒ์ผ๊นŒ? ํ•ต์‹ฌ์€ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ํ•จ์ˆ˜๋ฅผ await๊ณผ ๊ฐ™์ด ์จ์„œ ์‹คํ–‰์‹œํ‚ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฏธ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ/๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ ํ”„๋กœ๋ฏธ์Šค๊ฐ’์„ await๋ฅผ ํ†ตํ•ด ๋ฐ›๋Š” ์‹์ด๋‹ค.

๊ธฐ์กด์—๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์š”์ฒญ์„ ํ•˜๊ณ  ๋™์‹œ์— ์š”์ฒญ์ด ์™„๋ฃŒ๋ ๋•Œ ๊นŒ์ง€ await ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— 1์ดˆ์•ˆ์— ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด 2์ดˆ๊ฐ€ ๊ฑธ๋ ธ์—ˆ๋‹ค.

async function getFruites() {
  let a = await getApple(); // getApple() ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (1์ดˆ ์†Œ์š”)
  let b = await getBanana(); // getBanana() ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (1์ดˆ ์†Œ์š”)
  console.log(`${a} and ${b}`); // ์ด 2์ดˆ ์†Œ์š”
}

getApple() ์™€ getBanana() ๋น„๋™๊ธฐ ๋กœ์ง์ด ๋งŒ์ผ ์ˆœ์„œ๋ฅผ ์ง€์ผœ์•ผํ•˜๋Š” ๋กœ์ง์ด๋ผ๋ฉด ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์ง€๋งŒ, ํ˜„์žฌ๋กœ์„œ๋Š” ์„œ๋กœ ์—ฐ๊ด€ ์—†์ด ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์š”์ฒญ๊ณผ ๊ฐ’์„ await ํ•˜๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

async function getFruites(){

  let getApplePromise = getApple(); // asyncํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. 
  let getBananaPromise = getBanana(); // asyncํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. 
  
  // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ๊ฐ ๋ฐฑ๋‹จ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฑฐ์˜ ๋™์‹œ์— ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.
  console.log(getApplePromise)
  console.log(getBananaPromise)
  
  let a = await getApplePromise; // ์œ„์—์„œ ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ€์ˆ˜๋ฅผ await์„ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค.
  let b = await getBananaPromise; // ์œ„์—์„œ ๋ฐ›์€ ํ”„๋กœ๋ฏธ์Šค๊ฐ์ฒด ๊ฒฐ๊ณผ ๋ณ€์ˆ˜๋ฅผ await์„ ํ†ตํ•ด ๊บผ๋‚ธ๋‹ค.
  
  console.log(`${a} and ${b}`); // ๋ณธ๋ž˜๋ผ๋ฉด 1์ดˆ+1์ดˆ ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”๋ฐ, ์œ„์—์„œ 1์ดˆ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์—ฐ์†์œผ๋กœ ๋น„๋™๊ธฐ๋กœ ๋ถˆ๋ ค์™”๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ถฉ 1.01์ดˆ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ฒ˜๋ฆฌ๋œ๋‹ค.
})

async-await

 

Promise.all ๋ฉ”์†Œ๋“œ

๋˜๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋ก  Promise.all() ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์™„๋ฃŒ ์‹œ์ ์„ ๊ฐ€๋Š ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ์‹ค๋ฌด์—์„  Promise.all()๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Promise.all() ์€ ๋ฐฐ์—ด ์ธ์ž์˜ ๊ฐ ํ”„๋กœ๋ฏธ์Šค ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์ด resolve๊ฐ€ ๋ชจ๋‘ ๋˜์•ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค. ๋ฐฐ์—ด์ธ์ž์˜ ๊ฐ ํ”„๋กœ๋ฏธ์Šค ํ•จ์ˆ˜๋“ค์€ ์ œ๊ฐ๊ฐ ๋น„๋™๊ธฐ ๋…ผ๋ธ”๋กํ‚น์œผ๋กœ ์‹คํ–‰๋˜์–ด ์‹œ๊ฐ„์„ ๋‹จ์ถ• ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌํ„ด๊ฐ’์€ ๊ฐ ํ”„๋กœ๋ฏธ์Šค ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’๋“ค์ด ๋ฐฐ์—ด๋กœ ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค.

async function getFruites(){
  console.time();
  
  // ๊ตฌ์กฐ ๋ถ„ํ•ด๋กœ ๊ฐ ํ”„๋กœ๋ฏธ์Šค ๋ฆฌํ„ด๊ฐ’๋“ค์„ ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
  let [ a, b ] = await Promise.all([getApple(), getBanana()]); 
  console.log(`${a} and ${b}`);
  
  console.timeEnd();
}

getFruites();

Promise.all


top-level await

๊ธฐ์กด์—๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฌด์กฐ๊ฑด async function๋ฅผ ์ •์˜ํ•˜๊ณ  async ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์™€์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตณ์ด ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•„๋„ ๋  ์ฝ”๋“œ๋ฅผ ์–ด๊ฑฐ์ง€๋กœ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ IIFE๋กœ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์™”๋‹ค.

(async function func1() {
    const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
    console.log(data);
})();

์ด๋Ÿฌํ•œ ํ•œ๊ณ„์  ๋•Œ๋ฌธ์— ์ถ”๊ฐ€๋œ Top-level await ๋ž€ async ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ๋„ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ES2022์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ง€์›๋œ๋‹ค.

// Top Level์—์„  async funciton ์ •์˜์—†์ด ๊ณง๋ฐ”๋กœ await ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
console.log(data);

# ์ฐธ๊ณ ์ž๋ฃŒ

https://www.youtube.com/watch?v=aoQSOZfz3vQ