[TECH-QA] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜

๊ด€๋ จ ํ‚ค์›Œ๋“œ

์ง€์—ฐ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‘๋‹ต์„ฑ ํ–ฅ์ƒ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ 

์ž์›์„ ์ตœ์ ํ™”(์„ฑ๋Šฅ ์ตœ์ ํ™”)

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

๐Ÿ“ ์‹œ๊ฐ„ ์ง€์—ฐ ์ž‘์—… ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์‘๋‹ต์„ฑ ํ–ฅ์ƒ

๋„คํŠธ์›Œํฌ ์š”์ฒญ(์˜ˆ: API ํ˜ธ์ถœ), ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ํƒ€์ด๋จธ(setTimeout) ๋“ฑ์€ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ž‘์—…์ด๋‹ค. ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ 3์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ๋™๊ธฐ ๋ฐฉ์‹์—์„œ๋Š” 3์ดˆ ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฉˆ์ถฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋‚˜๋น ์ง€๋Š” ๊ฒฝํ—˜์ด ์žˆ๋‹ค.

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

๐Ÿ“ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ๊ฐœ์„ 

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

๐Ÿ“ ์ž์› ํšจ์œจ์„ฑ

์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ํœด ์ƒํƒœ๋กœ ๋‘์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ ํ˜„์‹ค์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ

ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์ค‘ ์ž‘์—…, ์ฆ‰ ๋ฐ์ดํ„ฐ ๋กœ๋“œ, ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„  aync/await

async/await๋Š” ES2017(ECMAScript 2017)์—์„œ ๋„์ž…๋œ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ ๋ฌธ๋ฒ•์œผ๋กœ, ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ธฐ์กด์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋กœ์ง ์ˆ˜์ •์ด ์–ด๋ ค์šด "์ฝœ๋ฐฑ ์ง€์˜ฅ(callback hell)" ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ async/await๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • async ํ‚ค์›Œ๋“œ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋น„๋™๊ธฐ ์ž‘์—…(Promise)์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// ์ฝœ๋ฐฑ ๋ฐฉ์‹
getData(function (data) {
  processData(data, function (result) {
    saveData(result, function (response) {
      console.log(response);
    });
  });
});

// async/await ๋ฐฉ์‹
async function handleData() {
  const data = await getData();
  const result = await processData(data);
  const response = await saveData(result);
  console.log(response);
}
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: try/catch ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
async function fetchUserData() {
  try {
    const response = await fetch('https://api.example.com/users');
    const data = await response.json();
    console.log('์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ:', data);
  } catch (error) {
    console.error('์—๋Ÿฌ ๋ฐœ์ƒ:', error);
  }
}

fetchUserData();
์œ„ ์ฝ”๋“œ์—์„œ fetch๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. await๋ฅผ ์‚ฌ์šฉํ•ด ์‘๋‹ต์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„, JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด catch ๋ธ”๋ก์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค. async/await ๋ฐฉ์‹์ด ํ›จ์”ฌ ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋””๋ฒ„๊น…๋„ ๊ฐ„ํŽธํ•ด์ง„๋‹ค.

Promise๋ž€

Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋กœ, ์ž‘์—…์˜ ์„ฑ๊ณต(resolve) ๋˜๋Š” ์‹คํŒจ(reject) ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์˜ ํ๋ฆ„์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ๊ตฌ์„ฑ

new Promise ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ •์˜๋˜๋ฉฐ, ๋‚ด๋ถ€์—์„œ resolve ๋˜๋Š” reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
const myPromise = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (์˜ˆ: 2์ดˆ ํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜)
  setTimeout(() => {
    const success = true; // ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    if (success) {
      resolve("์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"); // ์„ฑ๊ณต ์‹œ resolve ํ˜ธ์ถœ
    } else {
      reject("์ž‘์—…์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); // ์‹คํŒจ ์‹œ reject ํ˜ธ์ถœ
    }
  }, 2000);
});

// Promise ์‚ฌ์šฉ
myPromise
  .then((result) => {
    console.log(result); // 2์ดˆ ํ›„: "์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"
  })
  .catch((error) => {
    console.error(error); // ์‹คํŒจ ์‹œ ์ถœ๋ ฅ
  });

๐Ÿ“ ์ƒํƒœ

  • pending : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
  • fulfilled : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ
  • reject : ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ•œ ์ƒํƒœ
function simulateAsyncTask(delay, shouldSucceed) {
  return new Promise((resolve, reject) => {
    console.log("์ƒํƒœ: pending - ์ž‘์—…์ด ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.");

    setTimeout(() => {
      if (shouldSucceed) {
        resolve("์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
        // ์ƒํƒœ: fulfilled - ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚œ ์ƒํƒœ
      } else {
        reject(new Error("์ž‘์—…์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."));
        // ์ƒํƒœ: rejected - ์ž‘์—…์ด ์‹คํŒจํ•œ ์ƒํƒœ
      }
    }, delay);
  });
}

// 1. ์„ฑ๊ณต ์ผ€์ด์Šค (fulfilled ์ƒํƒœ๋กœ ์ „ํ™˜)
const successPromise = simulateAsyncTask(2000, true);
console.log("Promise ์ƒ์„ฑ ์งํ›„:", successPromise); // Promise { <pending> }

successPromise
  .then((result) => {
    console.log("์ƒํƒœ: fulfilled -", result); // 2์ดˆ ํ›„: "์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"
    console.log("Promise ์ƒํƒœ ํ™•์ธ:", successPromise); // Promise { "์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!" }
  })
  .catch((error) => {
    console.error("์—๋Ÿฌ:", error.message);
  });

// 2. ์‹คํŒจ ์ผ€์ด์Šค (rejected ์ƒํƒœ๋กœ ์ „ํ™˜)
const failPromise = simulateAsyncTask(1500, false);
console.log("Promise ์ƒ์„ฑ ์งํ›„:", failPromise); // Promise { <pending> }

failPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.log("์ƒํƒœ: rejected -", error.message); // 1.5์ดˆ ํ›„: "์ž‘์—…์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."
    console.log("Promise ์ƒํƒœ ํ™•์ธ:", failPromise); // Promise { <rejected> Error: ์ž‘์—…์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. }
  });

๐Ÿ“ ๋ฉ”์„œ๋“œ

  • .then(): ์„ฑ๊ณต ์‹œ ํ˜ธ์ถœ.
  • .catch(): ์‹คํŒจ ์‹œ ํ˜ธ์ถœ.
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = true; // ์„ฑ๊ณต ์—ฌ๋ถ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
      if (success) {
        resolve('๋ฐ์ดํ„ฐ ๋กœ๋“œ ์„ฑ๊ณต');
      } else {
        reject('๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹คํŒจ');
      }
    }, 2000);
  });
}

fetchData()
  .then((result) => console.log(result)) // 2์ดˆ ํ›„: "๋ฐ์ดํ„ฐ ๋กœ๋“œ ์„ฑ๊ณต"
  .catch((error) => console.error(error)); // ์‹คํŒจ์‹œ ํ˜ธ์ถœ
Promise ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ .then()๊ณผ .catch()๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ•ธ๋“ค๋งํ•ฉ๋‹ˆ๋‹ค.

async/await์™€ Promise์˜ ์ฐจ์ด

๐Ÿ“ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  • Promise : .catch()๋กœ ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌ.
  • async/await: try/catch๋กœ ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋ง.
// Promise ๋ฐฉ์‹
function getData() {
  fetch('https://api.example.com/data')
    .then((response) => response.json())
    .then((data) => console.log(data))
    .catch((error) => console.error(error));
}

// async/await ๋ฐฉ์‹
async function getData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

ํ™•์žฅ์„ฑ๊ณผ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

Promise.all์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๊ฐ€์ ธ์™€์•ผ ํ•  ๋•Œ, Promise.all์„ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์š”์ฒญ์ด ์™„๋ฃŒ๋œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
async function fetchMultipleData() {
  const [userData, postData] = await Promise.all([
    fetch('https://api.example.com/users'),
    fetch('https://api.example.com/posts'),
  ]);
  console.log(await userData.json(), await postData.json());
}