Node.js - YooByWk/YooByWk.github.io GitHub Wiki
Node.js
๊ฐ์
Node.js๋ google ํฌ๋กฌ์ V8 JavaScript ์์ง์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์คํ์์ค, ํฌ๋ก์ค ํ๋ซํผ JavaScript ๋ฐํ์ ํ๊ฒฝ์ด๋ค. ์๋ฒ ์ธก ๋คํธ์ํน ๋ฐ ๊ณ ์ฑ๋ฅ I/O ์ค์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋๋ฐ ์ค์ ์ ๋๋ฉฐ, ๋น๋๊ธฐ ๋ฐ ์ด๋ฒคํธ ๊ตฌ๋ํ ์ํคํ ์ฒ๋ฅผ ์ฑํํ๋ค.
Node.js๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด ์๋ CLI, ์๋ฒ ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ JavaScript๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ผ๋ฉฐ, FE์ BE ๊ฐ๋ฐ ์ธ์ด๋ฅผ ํต์ผํ ์ ์๊ฒ ๊ธฐ์ฌํ๋ค.
์ญ์ฌ
Node.js๋ 2009๋ "๋ผ์ด์ธ ๋ฌ"์ ์ํด ์ฒ์ ๊ณต๊ฐ๋์๋ค. ์น ์๋ฒ๋ค์ด ์ด๋ค ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์ ๋ธ๋กํน๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ, ๋๊ท๋ชจ ๋์ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ชฉํ.
์ฒ ํ
- Non-blocking I/O : ํ์ผ ์ ๊ทผ์ด๋ ๋คํธ์ํฌ ํต์ ๊ณผ ๊ฐ์ด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ ์ถ๋ ฅ ์์ ์ ์คํํ ๋ ํด๋น ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋๊ธฐํ์ง ์๊ณ ์ฆ์ ๋ค์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋จ
- ์ด๋ฒคํธ ๋ชจ๋ธ : ์์ ์ด ์๋ฃ๋๋ฉด, ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ด๋ฅผ ๊ฐ์งํ์ฌ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ ๋ฐฉ์์ผ๋ก ๋์์ฑ์ ๊ด๋ฆฌํ๋ค.
์ํคํ ์ฒ
V8 JavaScript ์์ง
V8 ์์ง์ JavaScript ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ๋จธ์ ์ฝ๋๋ก ๋ณํํ๊ณ ์คํํ๋ ์ญํ ์ ๋ด๋นํ๋ค. V8์ JIT(Just-in-time) ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์คํ ์ค ๋์ ์ผ๋ก ์ต์ ํํ๋ค.
Event Loop
๋ฉ์ธ ์ค๋ ๋์ ์ฝ ์คํ(Call Stack)๊ณผ ์ด๋ฒคํธ ํ(Event Queue)๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ์ฝ ์คํ์ด ๋น์์ ๋(๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ์ผ ๋) ์ด๋ฒคํธ ํ์ ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ Call Stack์ผ๋ก ์ฎ๊ฒจ ์คํํ๋ ์ํ ๊ตฌ์กฐ์ด๋ค. ์ด๋ฅผ ํตํด I/O ์์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ผ CPU ์๊ฐ์ ๋ญ๋นํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
Libuv
Node.js์ ๋น๋๊ธฐ I/O ์์ ์ ์ฒ๋ฆฌํ๋ C/C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ฉํฐ ์ค๋ ๋ ํ. OS ์ปค๋ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ I/O ์์ ์ ์ํํ๋ค.
I/O ์ฒ๋ฆฌ ๊ณผ์
์ํธํ๋ ํ์ผ I/O์ ๊ฐ์ ์๊ฐ์ด ์์๋๋ ์์ ์ Node.js ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์๋ Libuv๊ฐ ๊ด๋ฆฌํ๋ ๋ณ๋์ ์ค๋ ๋ ํ์์ ์คํ๋๋ค.
- ๋ฉ์ธ ์ค๋ ๋: ๋น๋๊ธฐ I/O ์์ ์ Libuv๋ก ์์.
- Libuv: ์ค๋ ๋ ํ์ ์ค๋ ๋ ์ค ํ๋์ ์์ ์ ํ ๋นํ๊ณ ์ฒ๋ฆฌ.
- Libuv: ์์ ์ด ์๋ฃ๋๋ฉด, ํด๋น ์์ ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด๋ฒคํธ ํ์ ์ถ๊ฐ.
- ์ด๋ฒคํธ ๋ฃจํ: ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ ํด ์ํ์ผ ๋(Call Stack์ด ๋น์์ ๋), ์ด๋ฒคํธ ํ์์ ์ฝ๋ฐฑ์ ๊ฐ์ ธ์ Call Stack์ ๋ฃ์ด ์คํ.
๋ชจ๋ ์์คํ
CommonJS(CJS) : Node.js ๊ฐ ์ด๊ธฐ์ ์ฑํํ ๋ชจ๋ ์์คํ .require()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ณ ,module.exports๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ด๋ณด๋ธ๋ค.ES Module(ESM) : ECMAScript ํ์ค์ ์ ์๋ ๋ชจ๋ ์์คํ .import์exportํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋น๋๊ธฐ ๋ก๋ฉ ๋ํ ๊ฐ๋ฅํ๋ค. ์ต์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
๊ฐ๋จํ ๋ด์ฅ ๋ชจ๋
http: HTTP ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑ ๊ฐ๋ฅfs: ํ์ผ ์์คํ ์ฝ๊ธฐ/์ฐ๊ธฐ/์์ /path: ํ์ผ ๊ฒฝ๋ก ๋ฑ์ ๋ค๋ฃฐ ์ ์๋ค.
NPM
Node.js์ ํ์ค ํจํค์ง ๊ด๋ฆฌ์.
์์ธํ ์ค๋ช ์ NPM ๋ฌธ์๋ก...
์ฃผ์ ํ์ฉ
- ์ค์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ : ์น์์ผ์ ํ์ฉํ ์ฑํ , ์ค์๊ฐ ํ์ , ์คํธ๋ฆฌ๋ฐ ๋ฑ
- API ์๋ฒ : ํต์ ์ด ๋น๋ฒํ ๋ฐฑ์๋ API ๋ ์ด์ด (
Express,NestJS๋ฑ ํ์ฉ) - ๋ง์ดํฌ๋ก ์๋น์ค: ์๊ณ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ API ๊ฒ์ดํธ์จ์ด ๋๋ ์๋น์ค
์ฅ์
- ์ธ์ด ํตํฉ : FE / BE ๋ชจ๋ JavaScript๋ฅผ ํตํ ๊ฐ๋ฐ ๊ฐ๋ฅ
- NPM ์ํ๊ณ : NPM์ ๊ท๋ชจ๋ ๋งค์ฐ ํฌ๋ค. ๋ฐฉ๋ํ ๋ชจ๋(ํจํค์ง) ์ง์์ผ๋ก ๊ฐ๋ฐ์๊ฐ์ ๋จ์ถ ๊ฐ๋ฅํ๋ค.
- ๊ณ ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ : ์ด๋ฒคํธ ๋ฃจํธ์ ๋ ผ๋ธ๋กํน I/O๋ฅผ ํตํด, I/O ์ง์ฝ์ ์์ ์์ ๋์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
๋จ์
- CPU ์ง์ฝ์ ์์ ์ ์ฝํจ : ์ฑ๊ธ ์ค๋ ๋ ํน์ฑ์, CPU ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ํธํ์ ๊ฐ์ ์์ ์๋ ๋ถ๋ฆฌํ๋ค.
- ์ฝ๋ฐฑ ์ง์ฅ : ๋น๋๊ธฐ ์์
์ด ๋ณต์กํด์ง ๊ฒฝ์ฐ ์ฝ๋ฐฑ ํจ์๊ฐ ์ค์ฒฉ๋์ด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์ ์ง.
๋ ๊ฑฐ์์์ ๋ง์ด ๋ณด์ธ๋ค
๋จ ์ฝ๋ฐฑ ์ง์ฅ์ ๊ฒฝ์ฐ,
Promise์async/await๋ฅผ ํตํด ๋๋ถ๋ถ ํด๊ฒฐ๋ ์ํฉ
์ฌ๋ด
Deno๋ผ๋ JavaScript / TypeScript ๋ฐํ์๋ ์กด์ฌํ๋ค.WebAssembly (Wasm): Node.js ํ๊ฒฝ์์ CPU ์ง์ฝ์ ์์ ์ ๊ณ ์ฑ๋ฅ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ณ ๋ ค ๊ฐ๋ฅํ ๊ธฐ์