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๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ํ’€์—์„œ ์‹คํ–‰๋œ๋‹ค.

  1. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ: ๋น„๋™๊ธฐ I/O ์ž‘์—…์„ Libuv๋กœ ์œ„์ž„.
  2. Libuv: ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜์— ์ž‘์—…์„ ํ• ๋‹นํ•˜๊ณ  ์ฒ˜๋ฆฌ.
  3. Libuv: ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด, ํ•ด๋‹น ์ž‘์—…์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ ํ์— ์ถ”๊ฐ€.
  4. ์ด๋ฒคํŠธ ๋ฃจํ”„: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์œ ํœด ์ƒํƒœ์ผ ๋•Œ(Call Stack์ด ๋น„์—ˆ์„ ๋•Œ), ์ด๋ฒคํŠธ ํ์—์„œ ์ฝœ๋ฐฑ์„ ๊ฐ€์ ธ์™€ Call Stack์— ๋„ฃ์–ด ์‹คํ–‰.

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

  1. CommonJS (CJS) : Node.js ๊ฐ€ ์ดˆ๊ธฐ์— ์ฑ„ํƒํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ. require() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , module.exports๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ธ๋‹ค.
  2. 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 ์ง‘์•ฝ์  ์ž‘์—…์„ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๋ ค ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ