๐ฏ ๋ฉด์ ์นดํ
โ 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 ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์คํ
โก๏ธ ์์
์ ์ฌ๋ฌ ๊ฐ์ ์์ ๋น๋๊ธฐ ์์
์ผ๋ก ๋๋์ด ์คํ
'TIL,WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฉด์ ์นดํ [Data structure] -14,15 (0) | 2025.02.18 |
---|---|
๋ฉด์ ์นดํ -์๊ณ ๋ฆฌ์ฆ (0) | 2025.02.17 |
๋ฉด์ ์นดํ 7,8 - ๊น์ ๋ณต์ฌ & ์์ ๋ณต์ฌ, JWT (1) | 2025.02.13 |
๋ฉด์ ์นดํ 5,6 - TIL 250212 (0) | 2025.02.12 |
๋ฉด์ ์นดํ 3,4๋ฒ - TIL250211 (0) | 2025.02.11 |