[JS] ๐Ÿค™ Promise ๋ฟŒ์‹œ๊ธฐ

hoheesuยท2025๋…„ 8์›” 11์ผ

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

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

๐Ÿค™Promise

๐Ÿ’กJavaScript์—์„œ Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ‘œ์ค€ ๊ฐ์ฒด๋‹ค.

ํ•˜์ง€๋งŒ then๊ณผ catch ์ •๋„๋งŒ ์“ฐ๊ณ  ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜, async/await๋กœ ๊ฐ์‹ธ์„œ "๋™๊ธฐ์ฒ˜๋Ÿผ" ๋ณด์ด๊ฒŒ๋งŒ ์“ด๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋„˜์–ด๊ฐ€๋ฉด ๋ฉด์ ‘, ์ฝ”ํ…Œ, ์‹ค๋ฌด ๋””๋ฒ„๊น…์—์„œ ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ์€ ํฌ๊ฒŒ ๋‹นํ•œ๋‹ค. (๋งˆ์น˜ ๋‚˜์ฒ˜๋Ÿผ,,,)

1๏ธโƒฃ Promise์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

Promise๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ์ƒํƒœ(state)๋ฅผ ๊ฐ€์ง„๋‹ค.

์ƒํƒœ์˜๋ฏธ์ „ํ™˜ ๊ฐ€๋Šฅ์„ฑ
pending๋Œ€๊ธฐ ์ค‘fulfilled ๋˜๋Š” rejected๋กœ ์ „ํ™˜
fulfilled์ดํ–‰๋จ(์„ฑ๊ณต)์ƒํƒœ ๊ณ ์ •
rejected๊ฑฐ๋ถ€๋จ(์‹คํŒจ)์ƒํƒœ ๊ณ ์ •
const promise = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
  if (/* ์„ฑ๊ณต */) {
    resolve("์„ฑ๊ณต ๋ฐ์ดํ„ฐ");
  } else {
    reject(new Error("์‹คํŒจ ์ด์œ "));
  }
});

๐Ÿšจ ํ•œ ๋ฒˆ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค์‹œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ (Immutable)


2๏ธโƒฃ ์‹คํ–‰ ์ˆœ์„œ

console.log(1);

Promise.resolve().then(() => console.log(2));

console.log(3);

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” 1 โ†’ 3 โ†’ 2 ์ˆœ์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ์ด๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด Call Stack, Microtask Queue, Macrotask Queue ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๐Ÿงบ ์Šคํƒ, ํ

Promise์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์„ธ๊ฐ€์ง€ ๊ฐœ๋…

์ด๋ฆ„์—ญํ• ์˜ˆ์‹œ
Call Stack (ํ˜ธ์ถœ ์Šคํƒ)์ง€๊ธˆ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ ๋ชฉ๋ก๋™๊ธฐ ์ฝ”๋“œ ์‹คํ–‰
Microtask Queue (๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ)Promise์˜ .then ์ฝœ๋ฐฑ ๊ฐ™์€, ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋Œ€๊ธฐ์—ดPromise.resolve().then(...)
Macrotask Queue (๋งคํฌ๋กœํƒœ์Šคํฌ ํ)setTimeout, setInterval์ฒ˜๋Ÿผ ๋‹ค์Œ ํ„ด์— ์‹คํ–‰ํ•  ์ž‘์—… ๋Œ€๊ธฐ์—ดsetTimeout(..., 0)

Call Stack (ํ˜ธ์ถœ ์Šคํƒ)

  • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์Œ“์ด๊ณ , ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋น ์ง„๋‹ค.
  • ๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ด ์Šคํƒ์— ์Œ“์˜€๋‹ค๊ฐ€ ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋จ.
  • ์Šคํƒ์ด ๋น„์–ด์•ผ๋งŒ ๋‹ค์Œ ์ž‘์—…(ํ์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ๋“ค)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
function a() { console.log("A"); }
function b() { a(); }
b();
// Call Stack: b() โ†’ a() โ†’ ์ฝ˜์†” ์ถœ๋ ฅ

Microtask Queue (๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ)

  • Promise์˜ .then/.catch/.finally ์ฝœ๋ฐฑ์ด ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ„๋‹ค.
  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋™๊ธฐ ์ฝ”๋“œ(Call Stack)๊ฐ€ ๋ชจ๋‘ ๋๋‚˜๋ฉด ๋‹ค์Œ๋ฒˆ์œผ๋กœ ์‹คํ–‰.
  • ๊ฐ™์€ ํ ์•ˆ์—์„œ ์ƒˆ ์ž‘์—…์ด ์ถ”๊ฐ€๋˜๋ฉด, ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰.

๐Ÿ’ก ๊ทธ๋ž˜์„œ ์œ„์˜ ์ฝ”๋“œ์—์„œ ์‹คํ–‰์ˆœ์„œ๊ฐ€ 1 โ†’ 3 โ†’ 2๊ฐ€ ๋๋˜ ๊ฒƒ์ด๋‹ค.

Macrotask Queue (๋งคํฌ๋กœํƒœ์Šคํฌ ํ)

  • setTimeout, setInterval๊ฐ™์€ ์ž‘์—…์ด ๋“ค์–ด๊ฐ„๋‹ค.
    โœ… ๋™๊ธฐ ์ฝ”๋“œ โ†’ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ์ „๋ถ€ โ†’ ๋งคํฌ๋กœํƒœ์Šคํฌ ์ˆœ์„œ๋กœ ์‹คํ–‰.
console.log(1);

setTimeout(() => console.log(2), 0);

console.log(3);
// ์‹คํ–‰ ์ˆœ์„œ: 1 โ†’ 3 โ†’ 2

๊ฐ ์Šคํƒ๊ณผ ํ์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ๋ธ”๋กœ๊ทธ๋กœ ๋” ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑ ์˜ˆ์ •

Promise์—์„œ ์ด ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

Promise๋Š” ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, setTimeout๋ณด๋‹ค ํ•ญ์ƒ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("promise"));
// ์ถœ๋ ฅ: promise โ†’ timeout

โœ… ํ•ต์‹ฌ

  • Call Stack: ์ง€๊ธˆ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ
  • Microtask Queue: Promise ์ฝœ๋ฐฑ ๋Œ€๊ธฐ์—ด โ†’ ๋™๊ธฐ ์ฝ”๋“œ ๋๋‚˜์ž๋งˆ์ž ์ฒ˜๋ฆฌ
  • Macrotask Queue: setTimeout ๋“ฑ โ†’ ํ•œ ํ„ด ๋๋‚  ๋•Œ๋งˆ๋‹ค 1๊ฐœ์”ฉ ์ฒ˜๋ฆฌ
  • Promise๊ฐ€ setTimeout๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” ์ด์œ ๋Š” ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ์šฐ์„  ์ฒ˜๋ฆฌ ๊ทœ์น™ ๋•Œ๋ฌธ

3๏ธโƒฃ Promise ์ฒด์ด๋‹

๐Ÿ’ก then์€ ์ƒˆ๋กœ์šด Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.resolve(1)
  .then(value => value + 1)
  .then(value => value * 2)
  .then(console.log); // 4
  • ๊ฐ then์€ ์ƒˆ๋กœ์šด Promise๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜
  • ์ด์ „ then์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ๋‹ค์Œ then์˜ ์ฝœ๋ฐฑ ์ธ์ž๋กœ ์ „๋‹ฌ๋จ
  • return์— Promise๋ฅผ ๋„ฃ์œผ๋ฉด ๊ทธ Promise๊ฐ€ resolve๋œ ๊ฐ’์ด ๋‹ค์Œ then์œผ๋กœ ๋„˜์–ด๊ฐ

4๏ธโƒฃ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

Promise.reject("์—๋Ÿฌ ๋ฐœ์ƒ")
  .then(res => console.log(res))
  .catch(err => console.error("์—๋Ÿฌ:", err))
  .finally(() => console.log("ํ•ญ์ƒ ์‹คํ–‰"));
  • catch๋Š” ์ด์ „ ์ฒด์ธ์—์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ์žก๋Š”๋‹ค.
  • finally๋Š” ์„ฑ๊ณต/์‹คํŒจ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹คํ–‰๋œ๋‹ค.

then์—์„œ์˜ ์—๋Ÿฌ

Promise.resolve()
  .then(() => {
    throw new Error("๋ฌธ์ œ ๋ฐœ์ƒ!");
  })
  .catch(err => console.error(err.message)); // "๋ฌธ์ œ ๋ฐœ์ƒ!"

then ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ โ†’ ์ž๋™์œผ๋กœ reject ์ƒํƒœ๋กœ ์ „ํ™˜


5๏ธโƒฃ Promise ๋ฉ”์„œ๋“œ ์ •๋ฆฌ

Promise.all

๐Ÿ’ก ๋ชจ๋“  Promise๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ ์™„๋ฃŒ
๐Ÿ’ก ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ฆ‰์‹œ reject

Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3),
]).then(console.log); // [1, 2, 3]

Promise.allSettled

๐Ÿ’ก ์„ฑ๊ณต/์‹คํŒจ ์ƒ๊ด€์—†์ด ๋ชจ๋“  Promise๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ

Promise.allSettled([
  Promise.resolve("OK"),
  Promise.reject("Fail")
]).then(console.log);

Promise.race

๐Ÿ’ก ๊ฐ€์žฅ ๋จผ์ € settled๋œ Promise์˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

Promise.race([
  new Promise(res => setTimeout(() => res("A"), 100)),
  new Promise(res => setTimeout(() => res("B"), 50)),
]).then(console.log); // "B"

Promise.any

๐Ÿ’ก ๊ฐ€์žฅ ๋จผ์ € ์„ฑ๊ณตํ•œ Promise ๋ฐ˜ํ™˜
๐Ÿ’ก ์ „๋ถ€ ์‹คํŒจํ•˜๋ฉด AggregateError ๋ฐœ์ƒ


โš ๏ธ Promise ์ฃผ์˜์ 

  • resolve์™€ reject ๋‘˜ ๋‹ค ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด pending ์ƒํƒœ๋กœ ์˜์›ํžˆ ๋จธ๋ฌพ
  • then ์•ˆ์—์„œ return ์•ˆ ํ•˜๋ฉด undefined๊ฐ€ ๋„˜์–ด๊ฐ
  • async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ throw ํ•˜๋ฉด ์ž๋™ reject
  • await๋Š” try/catch๋กœ ๊ฐ์‹ธ์•ผ ์•ˆ์ „
profile
๐Ÿค”๐Ÿ‘๐Ÿ’ก๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป๐Ÿคฏ๐Ÿ˜‡

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

comment-user-thumbnail
2025๋…„ 9์›” 18์ผ

Microtask Queue, Macrotask Queue์€ ์ฒ˜์Œ ์•Œ์•˜๋„ค์š” ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋‹ต๊ธ€