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

Binary Journey

[๋งค์ผ๋ฉ”์ผ] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋‚˜์š”? ๋ณธ๋ฌธ

daily/maeil-mail challenge

[๋งค์ผ๋ฉ”์ผ] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋‚˜์š”?

binaryJournalist 2025. 1. 22. 16:28
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ๋งค์ผ๋ฉ”์ผ์€ ๊ธฐ์ˆ ๋ฉด์ ‘ ๊ด€๋ จ ์งˆ๋ฌธ์„ ๋ฉ”์ผ๋กœ ๋งค์ผ ๋ณด๋‚ด์ฃผ๋Š” ๊ตฌ๋… ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก๋งค์ผ๋ฉ”์ผ ์ฑŒ๋ฆฐ์ง€๋Š” ์ œ ๊ฐœ์ธ์ ์ธ ์ฑŒ๋ฆฐ์ง€๋กœ ๋งค์ผ๋ฉ”์ผ์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ํ•˜๋ฃจ์น˜ ๋ฉ”์ผ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋‚˜์š”?

 

 

(2024.12.24)

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ด์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ํƒœ์Šคํฌ ํ(Task Queue)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • setTimeout, Promise, fetch ๋“ฑ์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” Web APIs์—์„œ ์ฒ˜๋ฆฌํ•œ ํ›„, Task Queue ๋˜๋Š” Microtask Queue์— ๋“ฑ๋ก
  • ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop) ๊ฐ€ Call Stack์ด ๋น„์—ˆ์„ ๋•Œ Task Queue์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰
  • Microtask Queue(Promise, MutationObserver) ๋Š” ์ผ๋ฐ˜ Task Queue๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋จ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ(Callback), ํ”„๋กœ๋ฏธ์Šค(Promise), async/await์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

๋ชจ๋ฒ” ๋‹ต์•ˆ


 

1๏ธโƒฃ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(Single Thread) ์–ธ์–ด์ด๋‹ค.

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

 

2๏ธโƒฃ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ํƒœ์Šคํฌ ํ(Task Queue)

 

๊ทธ๋ ‡๋‹ค๋ฉด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ๊นŒ?
๊ทธ ๋น„๋ฐ€์€ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ํƒœ์Šคํฌ ํ(Task Queue) ์— ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

๐Ÿ— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์›๋ฆฌ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €(Web APIs) ๋˜๋Š” Node.js ๋Ÿฐํƒ€์ž„๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

  1. Call Stack(์ฝœ ์Šคํƒ)
    • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
    • ์‹คํ–‰์ด ๋๋‚œ ํ•จ์ˆ˜๋Š” ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋จ (LIFO ๊ตฌ์กฐ)
  2. Web APIs (๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js ๋Ÿฐํƒ€์ž„ ์ œ๊ณต ๊ธฐ๋Šฅ)
    • setTimeout, setInterval, fetch, XMLHttpRequest, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ ๋น„๋™๊ธฐ API ์ œ๊ณต
    • ์‹คํ–‰ ํ›„ ๋ฐ”๋กœ Call Stack์—์„œ ์ œ๊ฑฐ๋จ
  3. Task Queue (์ฝœ๋ฐฑ ํ, Callback Queue ๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ, Message Queue)
    • Web APIs๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„
    • setTimeout, setInterval ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋๋‚˜๋ฉด ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ
  4. Microtask Queue (๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ)
    • Promise.then(), MutationObserver, queueMicrotask() ๋“ฑ์ด ์ €์žฅ๋จ
    • Task Queue๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋จ!
  5. Event Loop (์ด๋ฒคํŠธ ๋ฃจํ”„)
    • Call Stack์ด ๋น„์—ˆ์„ ๋•Œ Task Queue ๋˜๋Š” Microtask Queue์—์„œ ํƒœ์Šคํฌ๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰

 


 

 

โš™๏ธ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop) ๋™์ž‘ ๋ฐฉ์‹

 

๐Ÿ“Œ ์˜ˆ์ œ 1: ๋™๊ธฐ(Synchronous) ์ฝ”๋“œ ์‹คํ–‰

console.log("A");
console.log("B");
console.log("C");

โœ… ์ถœ๋ ฅ ๊ฒฐ๊ณผ

A
B
C
  • ๋ชจ๋“  ์ž‘์—…์ด Call Stack์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋จ.

 

 

๐Ÿ“Œ ์˜ˆ์ œ 2: ๋น„๋™๊ธฐ ์ฝ”๋“œ ์‹คํ–‰ (setTimeout)

console.log("A");

setTimeout(() => {
    console.log("B");
}, 1000);

console.log("C");

โœ… ์ถœ๋ ฅ ๊ฒฐ๊ณผ

A
C
B

๐Ÿ” ์‹คํ–‰ ๊ณผ์ •
1๏ธโƒฃ "A" ์ถœ๋ ฅ (Call Stack์—์„œ ์‹คํ–‰)
2๏ธโƒฃ setTimeout ์‹คํ–‰ → Web API๊ฐ€ ์ฒ˜๋ฆฌ ํ›„ 1์ดˆ ํ›„ Task Queue์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋“ฑ๋ก
3๏ธโƒฃ "C" ์ถœ๋ ฅ (Call Stack์—์„œ ์‹คํ–‰)
4๏ธโƒฃ 1์ดˆ ํ›„ Event Loop๊ฐ€ Task Queue์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰ → "B" ์ถœ๋ ฅ

 

 

 

๐Ÿ“Œ ์˜ˆ์ œ 3: Promise์™€ setTimeout์˜ ์‹คํ–‰ ์ˆœ์„œ ๋น„๊ต

console.log("A");

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

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

console.log("D");

โœ… ์ถœ๋ ฅ ๊ฒฐ๊ณผ

A
D
C
B

๐Ÿ” ์‹คํ–‰ ๊ณผ์ •
1๏ธโƒฃ "A" ์ถœ๋ ฅ
2๏ธโƒฃ setTimeout ์‹คํ–‰ → Web API์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„ Task Queue์— ์ถ”๊ฐ€
3๏ธโƒฃ Promise.resolve().then() ์‹คํ–‰ → Microtask Queue์— ์ถ”๊ฐ€
4๏ธโƒฃ "D" ์ถœ๋ ฅ
5๏ธโƒฃ Microtask Queue ์šฐ์„  ์‹คํ–‰"C" ์ถœ๋ ฅ
6๏ธโƒฃ Task Queue ์‹คํ–‰"B" ์ถœ๋ ฅ

 

 

 


 

 

 

๐Ÿ”ฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์‹œ์„ฑ(Concurrency)๊ณผ ๋ณ‘๋ ฌ์„ฑ(Parallelism)

 

โœ… ๋™์‹œ์„ฑ(Concurrency)

  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
  • ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋งˆ์น˜ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ฆ

 

โœ… ๋ณ‘๋ ฌ์„ฑ(Parallelism)

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์™„์ „ํžˆ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ

 

ํ•˜์ง€๋งŒ ์›น ์›Œ์ปค(Web Worker) ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ.

 

 

 


 

 

๐ŸŽฏ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค

โœ… 1. ์ฝœ๋ฐฑ ํ•จ์ˆ˜(Callback)
โœ… 2. ํ”„๋กœ๋ฏธ์Šค(Promise)
โœ… 3. async/await (ES2017 ์ถ”๊ฐ€)

 

๐Ÿ“Œ 1๏ธโƒฃ ์ฝœ๋ฐฑ ํ•จ์ˆ˜(Callback)

function fetchData(callback) {
    setTimeout(() => {
        callback("๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ!");
    }, 1000);
}

fetchData((message) => {
    console.log(message);
});

โœ… ๋‹จ์ : ์ฝœ๋ฐฑ ์ง€์˜ฅ(Callback Hell) ๋ฐœ์ƒ ๊ฐ€๋Šฅ

 

๐Ÿ“Œ 2๏ธโƒฃ ํ”„๋กœ๋ฏธ์Šค(Promise)

function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ!");
        }, 1000);
    });
}

fetchData().then((message) => {
    console.log(message);
});

โœ… ์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์ง

 

 

๐Ÿ“Œ 3๏ธโƒฃ async/await (ES2017 ์ถ”๊ฐ€)

async function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ!");
        }, 1000);
    });
}

async function main() {
    console.log("๋ฐ์ดํ„ฐ ์š”์ฒญ ์ค‘...");
    const data = await fetchData();
    console.log(data);
}

main();

โœ… ์žฅ์ : async/await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑ ๊ฐ€๋Šฅ

๋ฐ˜์‘ํ˜•