๊ด€๋ฆฌ ๋ฉ”๋‰ด

Ming's develop story

Promise๋ž€?(feat. async-await, Promise.all()) ๋ณธ๋ฌธ

D E V E L O P ๐Ÿ’ป/CS

Promise๋ž€?(feat. async-await, Promise.all())

Ming 2025. 2. 12. 13:58

Promise๋ž€?

  • ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ง„ํ–‰ ์ค‘์ด๋ฉด pending, ์„ฑ๊ณตํ•˜๋ฉด fulfilled โ†’ then() ๋ธ”๋ก ์‹คํ–‰, ์‹คํŒจํ•˜๋ฉด rejected โ†’ catch() ๋ธ”๋ก ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • Promise๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ then๊ณผ catch์˜ ์ฒด์ด๋‹์„ ํ†ตํ•ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ES6์—์„œ ๋„์ž…๋˜์—ˆ๋‹ค.

โœ… Promise ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

const fetchData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = true;
      if (success) resolve("๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์™„๋ฃŒ!");
      else reject("๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹คํŒจ!");
    }, 1000);
  });
};

fetchData()
  .then((result) => {
    console.log(result); // "๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์™„๋ฃŒ!"
  })
  .catch((error) => {
    console.error(error); // "๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹คํŒจ!"
  });

Promise ๋“ฑ์žฅ ์ด์ „์—๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋Š”๊ฐ€?

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

โŒ ์ฝœ๋ฐฑ ํ—ฌ ์˜ˆ์‹œ

function fetchUser(callback) {
  setTimeout(() => {
    console.log("์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ");
    callback();
  }, 1000);
}

function fetchPosts(callback) {
  setTimeout(() => {
    console.log("์œ ์ €์˜ ๊ฒŒ์‹œ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ");
    callback();
  }, 1000);
}

function fetchComments(callback) {
  setTimeout(() => {
    console.log("๊ฒŒ์‹œ๊ธ€์˜ ๋Œ“๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ");
    callback();
  }, 1000);
}

// ์ฝœ๋ฐฑ ํ—ฌ ๋ฐœ์ƒ
fetchUser(() => {
  fetchPosts(() => {
    fetchComments(() => {
      console.log("๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ!");
    });
  });
});

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋ ์ˆ˜๋ก ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€๋ฉฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋‚ฎ์•„์ง€๊ณ , ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

โœ… Promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๊ฐœ์„ ๋œ๋‹ค.

function fetchUser() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ");
      resolve();
    }, 1000);
  });
}

function fetchPosts() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("์œ ์ €์˜ ๊ฒŒ์‹œ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ");
      resolve();
    }, 1000);
  });
}

function fetchComments() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("๊ฒŒ์‹œ๊ธ€์˜ ๋Œ“๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ");
      resolve();
    }, 1000);
  });
}

fetchUser()
  .then(fetchPosts)
  .then(fetchComments)
  .then(() => console.log("๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ!"));


async-await์€ ๋ฌด์—‡์ธ๊ฐ€?

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

โœ… async-await ์‚ฌ์šฉ ์˜ˆ์‹œ

async function fetchData() {
  try {
    console.log("์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๋Š” ์ค‘...");
    await fetchUser();

    console.log("์œ ์ € ๊ฒŒ์‹œ๊ธ€ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘...");
    await fetchPosts();

    console.log("๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘...");
    await fetchComments();

    console.log("๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ!");
  } catch (error) {
    console.error(error);
  }
}

fetchData();

  • await์„ ์‚ฌ์šฉํ•˜๋ฉด then() ์ฒด์ด๋‹ ์—†์ด ๋™๊ธฐ์ ์ธ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

async-await ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

โ— ์—๋Ÿฌ ํ•ธ๋“ค๋ง

  • try-catch ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • await์ด ์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰์ด ์ค‘๋‹จ๋˜๋ฏ€๋กœ ์—๋Ÿฌ๋ฅผ ์žก์•„์ฃผ์ง€ ์•Š์œผ๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์˜ˆ์ œ

async function fetchData() {
  try {
    const result = await fetchDataFromAPI(); // ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
    console.log(result);
  } catch (error) {
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  }
}


โœ… Promise.all()

  • Promise.all()์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Promise๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ชจ๋“  Promise๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ•˜๋‚˜๋ผ๋„ rejected ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ „์ฒด๊ฐ€ ์‹คํŒจํ•œ๋‹ค.

โœ… Promise.all() ์‚ฌ์šฉ ์˜ˆ์‹œ

function fetchUser() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("์œ ์ € ์ •๋ณด"), 1000);
  });
}

function fetchPosts() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ"), 2000);
  });
}

function fetchComments() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("๋Œ“๊ธ€ ๋ฐ์ดํ„ฐ"), 1500);
  });
}

async function fetchAllData() {
  try {
    const [user, posts, comments] = await Promise.all([
      fetchUser(),
      fetchPosts(),
      fetchComments(),
    ]);

    console.log(user); // "์œ ์ € ์ •๋ณด"
    console.log(posts); // "๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ"
    console.log(comments); // "๋Œ“๊ธ€ ๋ฐ์ดํ„ฐ"
  } catch (error) {
    console.error("๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  }
}

fetchAllData();

โœ… Promise.all() vs await ๋น„๊ต

๋ฐฉ์‹ ์‹คํ–‰ ๋ฐฉ์‹ ์˜ˆ์ œ

Promise.all() ๋ณ‘๋ ฌ ์‹คํ–‰ (๋™์‹œ์— ์‹œ์ž‘) await Promise.all([fetchUser(), fetchPosts()])
await ๊ฐœ๋ณ„ ์‹คํ–‰ ์ˆœ์ฐจ ์‹คํ–‰ (ํ•˜๋‚˜์”ฉ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ์‹คํ–‰) await fetchUser(); await fetchPosts();

๐Ÿ”น ์–ธ์ œ Promise.all()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜?

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„œ๋กœ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์„ ๋•Œ.
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

๐Ÿ“Œ ์ •๋ฆฌ

  • Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด์ด๋ฉฐ, then()๊ณผ catch() ์ฒด์ด๋‹์„ ํ™œ์šฉํ•œ๋‹ค.
  • async-await์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • try-catch๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • Promise.all()์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Promise๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์Œ ๊ธ€์€ ๋™๊ธฐ, ๋น„๋™๊ธฐ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด์ž.

'D E V E L O P ๐Ÿ’ป > CS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋™๊ธฐ(Synchronous), ๋น„๋™๊ธฐ(Asynchronous)  (0) 2025.02.14
DOM ์˜ ๊ฐœ๋…  (0) 2025.02.10
Comments