๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL,WIL

๋ฉด์ ‘์นดํƒ€ 9,10 - Node.js, ์ด๋ฒคํŠธ ๋ฃจํ”„

by GREEN๋‚˜๋ฌด 2025. 2. 14.
728x90

๐ŸŽฏ ๋ฉด์ ‘์นดํƒ€ 

โœ… 9-1. Node.js๋Š” single-threaded ๊ธฐ๋ฐ˜ JS ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๋งŒํผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๐Ÿ“Œsingle-threaded

Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(Single-threaded) ๊ธฐ๋ฐ˜์˜ JavaScript ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ „ํ†ต์ ์ธ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, **์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)**์™€ ๋น„๋™๊ธฐ(Asynchronous) I/O ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ฒ˜๋Ÿผ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ๋Š” libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก Node.js์˜ ํŠน์ง•

  • ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  • ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰
  • CPU ์—ฐ์‚ฐ์ด ๋งŽ์€ ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ

๐Ÿ’ก ์˜ˆ์ œ ์ฝ”๋“œ

console.log("Start");

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

console.log("End");

๐Ÿ“Œ ์˜ˆ์ƒ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

Start
End
Timeout Callback

๐Ÿš€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ง€๋งŒ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— setTimeout() ์ฝœ๋ฐฑ์ด ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ” ๊ผฌ๋ฆฌ์งˆ๋ฌธ & ๋‹ต๋ณ€

Q1. Node.js๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ๋ฐ๋„ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”?
โžก๏ธ ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ libuv์˜ ์Šค๋ ˆ๋“œ ํ’€ ๋•๋ถ„์— I/O ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•จ.

Q2. CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ Node.js์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€?
โžก๏ธ worker_threads ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™œ์šฉ ๊ฐ€๋Šฅ.
โžก๏ธ cluster ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ž‘์—… ๋ถ„์‚ฐ ๊ฐ€๋Šฅ.

Q3. Node.js์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ๋‹จ์ ์€?
โŒ CPU ์—ฐ์‚ฐ์ด ๋งŽ์€ ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ.
โŒ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณผ๋ถ€ํ•˜๋˜๋ฉด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ.


โœ… 9-2. Node.js๋Š” non-blocking, asynchronous ๊ธฐ๋ฐ˜ JS ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์•„๋Š” ๋งŒํผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๐Ÿ“Œnon-blocking, asynchronous 

Node.js๋Š” Non-blocking(๋…ผ๋ธ”๋กœํ‚น) ๋ฐ Asynchronous(๋น„๋™๊ธฐ์ ) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” JavaScript ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.

โœ”๏ธ Non-blocking (๋…ผ๋ธ”๋กœํ‚น)

  • ํ•œ ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰ํ•จ.
  • CPU๊ฐ€ ์œ ํœด ์ƒํƒœ๊ฐ€ ๋˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ.

โœ”๏ธ Asynchronous (๋น„๋™๊ธฐ์ )

  • ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ฝœ๋ฐฑ(callback), Promise, async/await์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•จ.
  • ๋Œ€๊ทœ๋ชจ ๋™์‹œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•จ.

๐Ÿ’ก ์˜ˆ์ œ ์ฝ”๋“œ (๋ธ”๋กœํ‚น vs ๋…ผ๋ธ”๋กœํ‚น ๋น„๊ต)

// โŒ Blocking ๋ฐฉ์‹ (๋™๊ธฐ์ )
const fs = require("fs");
const data = fs.readFileSync("file.txt", "utf8"); // ํŒŒ์ผ ์ฝ๊ธฐ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
console.log(data);

// โœ… Non-blocking ๋ฐฉ์‹ (๋น„๋™๊ธฐ์ )
fs.readFile("file.txt", "utf8", (err, data) => {
  console.log(data);
});
console.log("ํŒŒ์ผ์„ ์ฝ๋Š” ์ค‘...");

๐Ÿ“Œ ์˜ˆ์ƒ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํŒŒ์ผ์„ ์ฝ๋Š” ์ค‘...
(file.txt ๋‚ด์šฉ ์ถœ๋ ฅ)

๐Ÿš€ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹ ๋•๋ถ„์— ํŒŒ์ผ์„ ์ฝ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ” ๊ผฌ๋ฆฌ์งˆ๋ฌธ & ๋‹ต๋ณ€

Q1. Node.js์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?
โžก๏ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜(callbacks)
โžก๏ธ Promise ๊ฐ์ฒด
โžก๏ธ async/await (ES8 ์ดํ›„ ๋“ฑ์žฅ, ๊ฐ€๋…์„ฑ ๊ฐœ์„ )

Q2. ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์€?
โœ… ์žฅ์ : ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„์— ์ ํ•ฉํ•จ.
โŒ ๋‹จ์ : ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ (์ฝœ๋ฐฑ ์ง€์˜ฅ).

Q3. async/await์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋ ๊นŒ์š”?
โžก๏ธ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ  ์—๋Ÿฌ ํ•ธ๋“ค๋ง์ด ์‰ฌ์›Œ์ง.
โžก๏ธ ๊ธฐ์กด์˜ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๋” ์ง๊ด€์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.


โœ… 10. Node.js์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•„๋Š” ๋งŒํผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๐Ÿ“Œ ๋‹ต๋ณ€

Node.js์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ๋น„๋™๊ธฐ I/O ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ๋‹ค์ค‘ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  • CPU ์‚ฌ์šฉ๋ฅ ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์„œ๋ฒ„ ์„ฑ๋Šฅ ํ–ฅ์ƒ

๐Ÿ› ๏ธ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋™์ž‘ ๋ฐฉ์‹
1๏ธโƒฃ Call Stack(์ฝœ ์Šคํƒ) → ๋™๊ธฐ ์ฝ”๋“œ ์‹คํ–‰
2๏ธโƒฃ Web APIs → ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ (setTimeout, fs ๋ชจ๋“ˆ, DB ์š”์ฒญ ๋“ฑ)
3๏ธโƒฃ Callback Queue(์ฝœ๋ฐฑ ํ) → ์™„๋ฃŒ๋œ ์ž‘์—…์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋Œ€๊ธฐ
4๏ธโƒฃ Event Loop(์ด๋ฒคํŠธ ๋ฃจํ”„) → ์ฝœ๋ฐฑ ํ์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰

๐Ÿ’ก ์˜ˆ์ œ ์ฝ”๋“œ

console.log("Start");

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

console.log("End");

๐Ÿ“Œ ์˜ˆ์ƒ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

Start
End
Timeout Callback

๐Ÿš€ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋•๋ถ„์— setTimeout()์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ!

๐Ÿ” ๊ผฌ๋ฆฌ์งˆ๋ฌธ & ๋‹ต๋ณ€

Q1. ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
โžก๏ธ Timers: setTimeout()๊ณผ setInterval() ์‹คํ–‰
โžก๏ธ Pending Callbacks: ์‹œ์Šคํ…œ ๊ด€๋ จ ์ฝœ๋ฐฑ ์‹คํ–‰
โžก๏ธ Idle, Prepare: ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋จ
โžก๏ธ Poll: I/O ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€ ํ™•์ธ ํ›„ ์‹คํ–‰
โžก๏ธ Check: setImmediate() ์‹คํ–‰
โžก๏ธ Close Callbacks: ์†Œ์ผ“ ๋‹ซ๊ธฐ ๋“ฑ์˜ ์ž‘์—… ์ˆ˜ํ–‰

Q2. setImmediate()์™€ process.nextTick()์˜ ์ฐจ์ด์ ์€?
โžก๏ธ setImmediate()๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ Check ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋จ
โžก๏ธ process.nextTick()์€ ์ฝœ ์Šคํƒ์ด ๋น„์›Œ์ง„ ์งํ›„ ์ฆ‰์‹œ ์‹คํ–‰๋จ

setImmediate(() => console.log("setImmediate"));
process.nextTick(() => console.log("nextTick"));
console.log("sync code");

๐Ÿ“Œ ์˜ˆ์ƒ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

sync code
nextTick
setImmediate

๐Ÿš€ nextTick์ด setImmediate๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋จ!

Q3. Node.js์—์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ™œ์šฉํ•˜์—ฌ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€?
โžก๏ธ worker_threads ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™œ์šฉ
โžก๏ธ cluster ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‹คํ–‰
โžก๏ธ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‹คํ–‰