[TECH-QA] ์ด๋ฒคํŠธ ๋ฃจํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ(single-threaded) ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ๋™์‹œ์„ฑ์„ ์ง€์›ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์ฝœ๋ฐฑ์‹คํ–‰, ํƒœ์Šคํฌ ํ ๊ด€๋ฆฌ ๋“ฑ์„ ๋‹ด๋‹นํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ๋œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ์ด ํƒœ์Šคํฌ ํ๋กœ ์ด๋™ํ•˜๊ณ  ์ฝœ์Šคํƒ์ด ๋นˆ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํ์—์„œ ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ์„ ๊บผ๋‚ด์™€ ์ฝœ์Šคํƒ์— ๋„ฃ์–ด์ฃผ๊ณ  ์ฝœ์Šคํƒ์—์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์ œ 1

console.log("1");

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

Promise.resolve()
    .then(() => {
        console.log("3");
    })
    .then(() => {
        console.log("4");
    });

console.log("5");

์ถœ๋ ฅ

1
5
3
4
2

์„ค๋ช…

  • "1"๊ณผ "5"๋Š” ๋™๊ธฐ ์ฝ”๋“œ๋กœ ๋จผ์ € ์‹คํ–‰.
  • Promise์˜ then์€ Microtask Queue์—์„œ ์ˆœ์ฐจ ์‹คํ–‰ ("3", "4").
  • setTimeout์€ Task Queue์—์„œ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰ ("2")

์ฝ”๋“œ ์˜ˆ์ œ 2

console.log("์‹œ์ž‘");

// setTimeout์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—… ์ถ”๊ฐ€ (Task Queue๋กœ ์ด๋™)
setTimeout(() => {
    console.log("setTimeout ์‹คํ–‰ (5์ดˆ ํ›„)");
}, 5000);

// Promise๋กœ ๋น„๋™๊ธฐ ์ž‘์—… ์ถ”๊ฐ€ (Microtask Queue๋กœ ์ด๋™)
Promise.resolve()
    .then(() => {
        console.log("Promise ์‹คํ–‰");
    });

// ๋ฌด๊ฑฐ์šด ๋™๊ธฐ ์ž‘์—… (Call Stack์—์„œ ๋ฐ”๋กœ ์‹คํ–‰)
for (let i = 0; i < 3; i++) {
    console.log("๋™๊ธฐ ์ž‘์—… ${i}");
}

console.log("๋");

์‹คํ–‰ ์ˆœ์„œ์™€ ์„ค๋ช…

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ์ˆœ์ฐจ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์‹œ์ž‘
๋™๊ธฐ ์ž‘์—… 0
๋™๊ธฐ ์ž‘์—… 1
๋™๊ธฐ ์ž‘์—… 2
๋
Promise ์‹คํ–‰
(5์ดˆ ํ›„) setTimeout ์‹คํ–‰ (5์ดˆ ํ›„)
  • console.log("์‹œ์ž‘"): Call Stack์— ์Œ“์ด๊ณ  ๋ฐ”๋กœ ์‹คํ–‰๋˜์–ด ์ถœ๋ ฅ.
  • setTimeout: ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ, 5์ดˆ ํ›„ ์‹คํ–‰๋  ์ฝœ๋ฐฑ์ด Task Queue์— ์ถ”๊ฐ€๋จ.
  • Promise.resolve().then(): Promise๋Š” Microtask Queue์— ์ถ”๊ฐ€๋จ (Microtask๋Š” Task Queue๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ).
  • for ๋ฃจํ”„: ๋™๊ธฐ ์ฝ”๋“œ๋กœ Call Stack์—์„œ ์ฆ‰์‹œ ์‹คํ–‰, "๋™๊ธฐ ์ž‘์—… 0, 1, 2" ์ถœ๋ ฅ.
  • console.log("๋"): Call Stack์— ์Œ“์ด๊ณ  ๋ฐ”๋กœ ์‹คํ–‰.
  • Call Stack์ด ๋น„์–ด์ง: ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ Microtask Queue๋ฅผ ํ™•์ธํ•˜๊ณ  Promise์˜ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ ("Promise ์‹คํ–‰" ์ถœ๋ ฅ).
  • 5์ดˆ ํ›„: ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ Task Queue์—์„œ setTimeout์˜ ์ฝœ๋ฐฑ์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ ("setTimeout ์‹คํ–‰" ์ถœ๋ ฅ).

์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋™์ž‘ ์š”์•ฝ

  • ๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ฆ‰์‹œ Call Stack์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ž‘์—…์€ Task Queue(์˜ˆ: setTimeout) ๋˜๋Š” Microtask Queue(์˜ˆ: Promise)์— ๋“ค์–ด๊ฐ€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” Call Stack์ด ๋น„์–ด ์žˆ์„ ๋•Œ ํ์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด ์‹คํ–‰ํ•˜๋ฉฐ, Microtask Queue๊ฐ€ Task Queue๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.
๊ด€๋ จ๊ฒŒ์‹œ๋ฌผ [์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„] : https://nam-yeun-hwa.github.io/posts/38
์ฐธ๊ณ  ์œ ํˆฌ๋ธŒ : https://www.youtube.com/watch?v=eiC58R16hb8