Tiny Bunny
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’กLanguage/JAVASCRIPT

[JS] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ์™€ Promise

by soonybutter 2025. 4. 26.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ์™€ Promise

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Promise์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž!


1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ; ์ฝœ๋ฐฑ ํ•จ์ˆ˜(Callback)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์ž‘๋™ํ•œ๋‹ค.


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

 

 

๋Œ€ํ‘œ์ ์ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

// ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๋น„๋™๊ธฐํ•จ์ˆ˜ ์•ˆ์—์„œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœ
function add(a, b, callback) {
    setTimeout(() => {
        const sum = a + b;
        callback(sum);
    }, 3000);
}

add(1, 2, (value) => {
    console.log(value); // 3์ดˆ ํ›„ 3 ์ถœ๋ ฅ
});
  • setTimeout์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ชจ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ.
  • 3์ดˆ ํ›„์— ๋‘ ์ˆ˜๋ฅผ ๋”ํ•œ ๊ฐ’์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋„˜๊น€.

 

 

์ฝœ๋ฐฑ ์ง€์˜ฅ (Callback Hell)

 

์ฝœ๋ฐฑ์„ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ ์  ์ค‘์ฒฉ๋˜๊ณ  ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผ '์ฝœ๋ฐฑ ์ง€์˜ฅ'์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

// ์Œ์‹ ์ฃผ๋ฌธํ•˜๊ธฐ
function orderFood(callback) {
    setTimeout(() => {
        const food = "๋–ก๋ณถ์ด";
        callback(food);
    }, 3000);
}

// ์Œ์‹ ์‹ํžˆ๊ธฐ
function cooldownFood(food, callback) {
    setTimeout(() => {
        const cooldownedFood = `์‹์€ ${food}`;
        callback(cooldownedFood);
    }, 2000);
}

// ์Œ์‹ ๋ƒ‰๋™ํ•˜๊ธฐ
function freezeFood(food, callback) {
    setTimeout(() => {
        const freezedFood = `๋ƒ‰๋™๋œ ${food}`;
        callback(freezedFood);
    }, 1500);
}

// ์ฝœ๋ฐฑ ์ง€์˜ฅ ๋ฐœ์ƒ
orderFood((food) => {
    console.log(food);

    cooldownFood(food, (cooldownedFood) => {
        console.log(cooldownedFood);

        freezeFood(cooldownedFood, (freezedFood) => {
            console.log(freezedFood);
        });
    });
});
 
  • orderFood โ†’ cooldownFood โ†’ freezeFood ์ˆœ์„œ๋กœ ์ž‘์—…์ด ์ง„ํ–‰๋ผ์•ผ ํ•˜๋Š”๋ฐ, ์ฝœ๋ฐฑ ์•ˆ์— ์ฝœ๋ฐฑ, ๋˜ ๊ทธ ์•ˆ์— ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด์•ผ ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.

 

 

โžก๏ธ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒŒ ๋ฐ”๋กœ Promise 

 


 

1.  Promise๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

 

Promise๋Š” '๋ฏธ๋ž˜์— ์™„๋ฃŒ๋  ์ˆ˜๋„, ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋Š” ์ž‘์—…'์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด
๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณด๋‹ค ๊น”๋”ํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 

Promise๋Š” ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.


pending (๋Œ€๊ธฐ) ์ž‘์—…์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
fulfilled (์„ฑ๊ณต) ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ (resolve ํ˜ธ์ถœ)
rejected (์‹คํŒจ) ์ž‘์—…์ด ์‹คํŒจํ•œ ์ƒํƒœ (reject ํ˜ธ์ถœ)

 

์ฆ‰, Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋‹ค.

 


 

2. Promise ๊ธฐ๋ณธ ๊ตฌ์กฐ

 

Promise ๊ฐ์ฒด๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ƒ์„ฑํ•œ๋‹ค.

const promise = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve("์ž‘์—… ์„ฑ๊ณต!");
    } else {
      reject("์ž‘์—… ์‹คํŒจ!");
    }
  }, 2000);
});
 
  • resolve(value): ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
  • reject(error): ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜

 


 

3.  Promise ์‚ฌ์šฉํ•˜๊ธฐ - then๊ณผ catch

 

Promise๋Š” then๊ณผ catch ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

  • .then (์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ)
  • .catch (์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ)
promise
  .then((value) => {
    console.log(value); // "์ž‘์—… ์„ฑ๊ณต!" ์ถœ๋ ฅ
  })
  .catch((error) => {
    console.log(error); // ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ์ถœ๋ ฅ
  });

 

 


 

๐Ÿ’ก์˜ˆ์‹œ์ฝ”๋“œ ์ˆซ์ž์— 10 ๋”ํ•˜๊ธฐ (add10 ํ•จ์ˆ˜)

 

 

function add10(num) {
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      if (typeof num === "number") {
        resolve(num + 10);
      } else {
        reject("num์ด ์ˆซ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค");
      }
    }, 2000);
  });

  return promise;
}
  • num์ด ์ˆซ์ž์ด๋ฉด 2์ดˆ ํ›„์— 10์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
  • num์ด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜
const p = add10(0);

p.then((result) => {
  console.log(result);      // 10
  return add10(result);     // 10 + 10
}).then((result) => {
  console.log(result);      // 20
  return add10(result);     // 20 + 10
}).then((result) => {
  console.log(result);      // 30
}).catch((error) => {
  console.log(error);       // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์‹คํ–‰
});
 
  • ์ฒ˜์Œ 0์„ ๋„˜๊ธฐ๊ณ  10์„ ๋”ํ•œ 10์„ ๋ฐ˜ํ™˜
  • ์ด์–ด์„œ 10์„ ๋ฐ›์•„ ๋˜ 10์„ ๋”ํ•œ 20์„ ๋ฐ˜ํ™˜
  • ๋˜ ์ด์–ด์„œ 20์„ ๋ฐ›์•„ 10์„ ๋”ํ•œ 30์„ ๋ฐ˜ํ™˜
  • ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด .catch ๋ธ”๋ก์—์„œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌ

 

 


 

 

5.  Promise ์ฒด์ด๋‹ (Chaining)

Promise์˜ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” then์„ ์—ฐ์†ํ•ด์„œ ์ด์–ด๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

โžก๏ธ Promise ์ฒด์ด๋‹

 

 

๊ฐ then์€ ์ด์ „ then์ด ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ๋‹ค์Œ then์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

add10(5)
  .then(result => add10(result))
  .then(result => add10(result))
  .then(result => console.log(result)) // ์ตœ์ข… ๊ฒฐ๊ณผ ์ถœ๋ ฅ
  .catch(error => console.log(error));
  • ๋น„๋™๊ธฐ ์ž‘์—…์ด ์ˆœ์„œ๋Œ€๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ด์–ด์ง„๋‹ค.
  • ์ค‘๊ฐ„์— ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ฐ”๋กœ .catch()๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 


 

 

๐Ÿ’ก์š”์•ฝ

 

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

 

 

 


 

 

 

 

 


์งˆ๋ฌธ์ด๋‚˜ ์ถ”๊ฐ€ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”! ๐Ÿ˜Š

728x90

TOP

Designed by ํ‹ฐ์Šคํ† ๋ฆฌ