์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
Node.jsยฎ
์ข…๋ฅ˜
JavaScript ๋Ÿฐํƒ€์ž„(์‹คํ–‰ํ™˜๊ฒฝ)
๋ผ์ด์„ ์Šค
๊ฐœ๋ฐœ
Node.js contributors
๋ฒ„์ „
15

1. ๊ฐœ์š”2. ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ
2.1. ์„ค์น˜
2.1.1. NVM์„ ์ด์šฉํ•œ ์„ค์น˜2.1.2. ๋ฆฌ๋ˆ…์Šค์—์„œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•œ ์„ค์น˜
2.2. Hello, World!
3. ํŠน์ง•
3.1. ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ3.2. ์˜ค๋ฅ˜์ฒ˜๋ฆฌ3.3. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ
4. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €
4.1. ๊ณต์‹ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €
4.1.1. npm
4.2. ๋น„๊ณต์‹ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €
4.2.1. yarn4.2.2. ๊ธฐํƒ€
5. ์—ฌ๋‹ด
5.1. Node.js๋Š” ํ”„๋ ˆ์ž„์›Œํฌ?5.2. ์„ฑ๋Šฅ ์ด์•ผ๊ธฐ
6. ๊ฐ™์ด ๋ณด๊ธฐ
6.1. ์ฐธ์กฐ ๋ฌธ์„œ6.2. ํ”„๋ ˆ์ž„์›Œํฌ6.3. ์‡ผ์ผ€์ด์Šค6.4. ๊ธฐํƒ€

1. ๊ฐœ์š”[ํŽธ์ง‘]

2009๋…„ 5์›” 27์ผ ์ฒ˜์Œ ์†Œ๊ฐœ๋œ Node.js๋Š” ์˜คํ”ˆ ์†Œ์Šค JavaScript ์—”์ง„์ธ ํฌ๋กฌ V8์— ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libuv๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”Œ๋žซํผ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, JavaScript๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋‹ค. Ryan Dahl์ด ์ฒ˜์Œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ,[1] ์ฒ˜์Œ์—” ๋ฆฌ๋ˆ…์Šค์™€ macOS๋งŒ ์ง€์›๋˜์—ˆ์œผ๋‚˜ 2011๋…„ 7์›”์— Windows ๋ฒ„์ „๋„ ๋ฐœํ‘œ๋˜์—ˆ๋‹ค.

๋นˆ๋ฒˆํ•œ I/O์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ์˜ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ, ์„œ๋ฒ„ ํ™•์žฅ์˜ ์šฉ์ด์„ฑ, ๋ฌด์—‡๋ณด๋‹ค๋„ JavaScript๋ผ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ•„์ˆ˜ ์–ธ์–ด๋กœ ๋ฐฑ์—”๋“œ๊นŒ์ง€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„์ฒญ๋‚œ ์žฅ์  ๋•Œ๋ฌธ์— ์ถœ์‹œ ์ดํ›„๋กœ ๋น ๋ฅด๊ฒŒ ์ ์œ ์œจ์„ ๋†’์—ฌ๊ฐ€๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ํŠธ์œ„ํ„ฐ ๋“ฑ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์–‘์˜ ์ธํ’‹ ์•„์›ƒํ’‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค์— ์žˆ์–ด์„œ ๊ฐ•์ ์ด ๋‘๋“œ๋Ÿฌ์ง„๋‹ค.

2014๋…„ 12์›” ํ•œ๋•Œ Node.js์˜ ํฌํฌ์ธ io.js๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด์„œ Node.js 0.12 ๋ฒ„์ „, io.js 3.3 ๋ฒ„์ „๊นŒ์ง€ ์„œ๋กœ ๋ถ„์—ด๋œ ๋ชจ์Šต์œผ๋กœ ์ด์–ด์ง€๋Š” ๋“ฏ ํ–ˆ์ง€๋งŒ, 2015๋…„ 9์›”์— Node.js 4.0 ๋ฒ„์ „์œผ๋กœ ๋ณ‘ํ•ฉ๋˜์–ด ํ˜„์žฌ์— ์ด๋ฅด๋ €๋‹ค.

2020๋…„ 12์›” 12์ผ ๊ธฐ์ค€์œผ๋กœ ์ตœ์‹  ๋ฒ„์ „์€ 15.4.0, LTS ๋ฒ„์ „์€ 14.15.1์ด๋‹ค. ์ตœ์‹  ๋ฒ„์ „์€ ๊ธฐ๋Šฅ์ด ๋ถˆ์•ˆ์ •ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ๋ชจ๋“ˆ[2](ํŒจํ‚ค์ง€)์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด LTS ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

2. ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ[ํŽธ์ง‘]

2.1. ์„ค์น˜[ํŽธ์ง‘]

๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ํ™ˆํŽ˜์ด์ง€์— ๋Œ€๋ฌธ์ง๋งŒํ•˜๊ฒŒ ๋‚˜์™€์žˆ๋Š” ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค๋งŒ Node.js๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ ํ”„๋กœ๊ทธ๋žจ ํ˜น์€ ์›น์‚ฌ์ดํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œํ•˜๋‹ค ๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋…ธ๋“œ ๋ฒ„์ „์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ๋Š” NVM(Node Version Manager)์„ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ node.js๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋„, node.js๋ฅผ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด nvm์„ ์“ฐ๊ฒŒ ๋œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•ด์„œ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ณณ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ ๋ฐฉ๋Œ€ํ•œ ๋…ธ๋“œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋นŒ๋“œํ•ด์•ผ ํ•˜๊ธฐ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์ž. ์‚ฌ์‹ค ์†Œ์Šค์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•  ์ƒ๊ฐ์„ ํ•  ๋•Œ๋ฉด ์ด๋ฏธ ์‹œ๊ฐ„ ๊ฐ™์€ ๊ฑด ์ƒ๊ด€์ด ์—†์„ ๊ฒƒ์ด๋‹ค

2.1.1. NVM์„ ์ด์šฉํ•œ ์„ค์น˜[ํŽธ์ง‘]

bash๊ฐ€ ์ง€์›๋˜๋Š” ํ™˜๊ฒฝ์ธ ๋ฆฌ๋ˆ…์Šค, ๋งฅ[3]์—์„œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ ๋‘ ์ค„ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
๋งŒ์•ฝ ์ž์‹ ์ด bash์™€ ๋ช…๋ น์–ด๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” fish๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ fish์šฉ nvm์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์ด ๊ณณ์—์„œ fish์šฉ bash-nvm์˜ wrapper๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. zsh ์‚ฌ์šฉ์ž๋Š” ์—ฌ๊ธฐ์„œ zsh์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์„ค์น˜ ์ดํ›„ ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด Node.js๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ nvm install 14.15.1 # ์˜ˆ์‹œ๋กœ 14.15.1 ๋ฒ„์ „์˜ node์™€ ๊ทธ์— ๋งž๋Š” npm ์„ค์น˜
$ nvm use 14.15.1 # ํ•ด๋‹น ๋ฒ„์ „ ํ™œ์„ฑํ™”

2.1.2. ๋ฆฌ๋ˆ…์Šค์—์„œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•œ ์„ค์น˜[ํŽธ์ง‘]

์ฃผ์š” ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ๋Š” NodeSource์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฒ„์ „๋ณ„๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ›์•„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ถ„ํˆฌ, ๋ฐ๋น„์•ˆ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.

$ curl -sL https://deb.nodesource.com/setup_[๋ฉ”์ด์ € ๋ฒ„์ „].x | sudo -E bash -
$ sudo apt-get install -y nodejs
์˜ˆ๋ฅผ๋“ค์–ด Node.js 14 ๋ฒ„์ „๋Œ€๋ฅผ ์„ค์น˜ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs
๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ Node.js๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ฒ„์ „๋Œ€๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์„ ์“ด๋‹ค๋ฉด ์ด ๊ณณ์—์„œ ์ง์ ‘ ์ž์‹ ์˜ ๋ฐฐํฌํŒ์— ๋งž๋Š” ๋ช…๋ น์ค„์„ ์ฐพ์•„ ์ž…๋ ฅํ•˜์ž.[4]

2.2. Hello, World![ํŽธ์ง‘]

ใ€HTTP(์›น)๋กœ Hello, World! ์ถœ๋ ฅํ•˜๊ธฐใ€‘
Node.js๊ฐ€ ์„ค์น˜๋œ ์ƒํƒœ์—์„œ ์•„๋ฌด ์—๋””ํ„ฐ๋‚˜ ๋„์šฐ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ๋Š”๋‹ค. ๋ฉ”๋ชจ์žฅ๋„ ๊ดœ์ฐฎ๋‹ค.
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello, World!\n');
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
์ €์žฅํ•˜๊ณ  ํ„ฐ๋ฏธ๋„ ๋“ฑ์—์„œ 'node filename'[5] ์ด๋ผ๊ณ  ์ž…๋ ฅํ•ด์ฃผ๊ณ  ๋‚˜์„œ, ์—ญ์‹œ ์•„๋ฌด ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์ผœ๊ณ  localhost:8080์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์•„๋งˆ 'Hello, world!'๋ผ๊ณ  ๋œฐ ๊ฒƒ์ด๋‹ค.

JavaScript์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ์ž…๋ฌธ์ž์˜ ๊ฒฝ์šฐ ์‚ฌ์‹ค Hello, World!๋ถ€ํ„ฐ ๋ณต์žกํ•ด๋ณด์ด๊ธด ํ•˜๋‹ค. ๋•Œ๋ฌธ์— Hello, World! ์˜ˆ์ œ๋ฅผ ์กฐ๊ธˆ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.์œ„ ์˜ˆ์ œ๋Š” ์ฝœ๋ฐฑ์ด๋ผ๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ Hello, World๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ฐœ๋…์ด๋ฏ€๋กœ, ์ดˆ์‹ฌ์ž๋“ค์€ ์™œ ์ €๋ ‡๊ฒŒ ํ•˜๋Š”์ง€ ๋‹น์žฅ ๋ชจ๋ฅด๊ฒ ์–ด๋„ ๊ฒ๋จน์ง€ ๋ง๊ณ  ์ƒํ™œ์ฝ”๋”ฉ ๋“ฑ๊ณผ ๊ฐ™์€ Node.js ๊ฐ€์ด๋“œ๋ฅผ ์ฐฌ์ฐฌํžˆ ๋ณด์ž.

ใ€ํ„ฐ๋ฏธ๋„(stdout)๋กœ Hello, World! ์ถœ๋ ฅํ•˜๊ธฐใ€‘
Node.js๋„ Python, Lua์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Ÿฐํƒ€์ž„ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ž์ฒด ๋Œ€ํ™”ํ˜• ์ฝ˜์†”(REPL; Read-Eval-Print Loop)์„ ์ œ๊ณตํ•œ๋‹ค.
CMD ๋˜๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ฌด๋Ÿฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด node๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ REPL ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. ํ•ด๋‹น ํ™”๋ฉด์—์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.
console.log("Hello, World!")
์•„๋ž˜์™€ ๊ฐ™์ด ๋œจ๋ฉด ์ž˜ ์‹คํ–‰์ด ๋œ ๊ฒƒ์ด๋‹ค.

> console.log("Hello, World!")
Hello, World!
undefined
Hello, World!๋Š” console.log ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ํ‘œ์ค€ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋‚ด๋ณด๋‚ธ ๋ฒ„ํผ์ด๊ณ , ์•„๋ž˜์— ๋ถ™๋Š” undefined๋Š” console.log ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚˜๋ฉด์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

์ฐธ๊ณ ๋กœ REPL์—์„œ ๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” Ctrl(cmd)+D๋ฅผ ๋ˆŒ๋Ÿฌ EOL ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

ใ€ํ…”๋„ท ํด๋ผ์ด์–ธํŠธ๋กœ Hello, World! ์ถœ๋ ฅํ•˜๊ธฐใ€‘
ํ…”๋„ท ์„œ๋ฒ„๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์„ค BBS๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
const net = require('net');
const telnet = net.createServer();

telnet.on('connection', client => {
    client.write('Hello, world!');
});

telnet.listen(23);

3. ํŠน์ง•[ํŽธ์ง‘]

3.1. ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ[ํŽธ์ง‘]

Node.js๋Š” ๊ณ ์„ฑ๋Šฅ์˜ ๋น„๋™๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ ํ”Œ๋žซํผ์œผ๋กœ ๊ตฌ์ƒ๋˜์—ˆ๋‹ค. ์ตœ์ดˆ ์ž‘์„ฑ์ž์ธ Ryan Dahl์€ ์›น ํ”„๋กœ๊ทธ๋žจ ๋ถ„์•ผ์—์„œ ๋ธŒ๋ผ์šฐ์ €์˜ JavaScript ์—”์ง„์ด UI ์Šค๋ ˆ๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ํ™˜๊ฒฝ[6]์—์„œ ๋ฝ์„ ํ”ผํ•˜๊ณ ์ž ์‹œ๋ถ„ํ• ๊ณผ ์ด๋ฒคํŠธ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด๊ณ  ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•๋ก ์ด๋ผ ์ƒ๊ฐํ•ด ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด๋•Œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆฌ์•กํ„ฐ ํŒจํ„ด์— ์˜ํ•œ CPS(Continuation-Passing Style)๋กœ ์ž‘์„ฑ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์ด Node.js์— ๊ณ ์„ฑ๋Šฅ์„ ์„ ์‚ฌํ•˜๋Š” ๊ธฐ๋ฒ•์ธ ๋™์‹œ์— ๋น„์ˆ™๋ จ์ž์—๊ฒŒ ๋””๋ฒ„๊น… ์ง€์˜ฅ์„ ๋งŒ๋“œ๋Š” ์• ์ฆ์˜ ๊ด€๊ณ„๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. ๊ถ๊ธˆํ•˜๋ฉด ์œ„์˜ ๊ฐ„๋‹จํ•œ http ์„œ๋ฒ„์—์„œ createServer๊ฐ€ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ http ์š”์ฒญ์— ์ด์–ด์ง€๋Š” ์‹คํ–‰์ง€์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๋ณด๋„๋ก ํ•˜์ž. Node.js๊ฐ€ ์ž๋ž‘ํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ์„ ํฌํ•จํ•œ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๊ฐ€ ๋น„๋™๊ธฐํ™” ์ง€์ ๋งˆ๋‹ค ์ €๋ ‡๊ฒŒ CPS๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ด CPS ํŠน์ง• ๋•Œ๋ฌธ์— Node.js ์ดˆ์‹ฌ์ž๋Š” ์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฌดํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ์ž‘์„ฑ๋ผ์„œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋Œ€๊ฐ์„ ์œผ๋กœ ์“ฐ์—ฌ์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
const http = require('http');
const server = http.createServer(helloResponse);

function helloResponse(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}

server.listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');
ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ JavaScript๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตณ์ด ์ฝ”๋“œ์˜ ์œ„์ชฝ์— ์„ ์–ธํ•  ํ•„์š” ์—†์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„ ์•ˆ์— ์ •์˜๋งŒ ๋ผ ์žˆ์œผ๋ฉด ์ž๋™ ํ˜ธ์ด์ŠคํŒ…์ด ๋ผ์„œ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒŒ ๊น”๋”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ createServer ์œ„์ชฝ์— ์„ ์–ธํ•  ์ƒ๊ฐ์„ ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ํ”ผํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ์ฝœ๋ฐฑ ์ง€์˜ฅ์— ๋‹ค์‹œ ๋›ฐ์–ด๋“œ๋Š” ๊ผด์ด ๋œ๋‹ค. ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ๋Š” ํ•จ์ˆ˜์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์‹คํ–‰ ์ˆœ์„œ์™€ ์ •๋ฐ˜๋Œ€์ธ ์•„๋ž˜์—์„œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•œ ๋ฐœ๋ฒ„๋‘ฅ์˜ ์‚ฐ๋ฌผ๋กœ Generator์™€ Promise๊ฐ€ ๋“ฑ์žฅํ•˜์˜€๋‹ค. ์ดํ›„ ES2017์—์„œ๋Š” Promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” async/await ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜์–ด ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๊ฑฐ์˜ ์ฐจ์ด๊ฐ€ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ์  ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

3.2. ์˜ค๋ฅ˜์ฒ˜๋ฆฌ[ํŽธ์ง‘]

๋…ธ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋ง์„ ์•ˆํ•˜๋ฉด ์˜ˆ์™ธ๋ฐœ์ƒ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๊บผ์ง„๋‹ค. ํ•˜๋‹ค๋ชปํ•ด ๋ณด์•ˆ์ ‘์† ํ•˜๋Š” ํ˜•ํƒœ์— ํ”ผ์น˜๋ชปํ•  ์‚ฌ์ •์œผ๋กœ ์ ‘์†์„ ํ•ญ์‹œ ์œ ์ง€ํ•œ๋‹ค๋ฉด ๋งค ์ฃผ๊ธฐ๋ณ„๋กœ ์žฌ์‘๋‹ต ํ•ด์ฃผ๊ฒ ์œผ๋‚˜ ํ˜น์‹œ๋ชจ๋ฅผ ์ ‘์†๋Š๊น€์ด ๋ฐœ์ƒํ•  ์—ฌ์ง€๋Š” ๋งŽ์€๋ฐ ์ ˆ๋Œ€๋กœ ๊ฐ„๊ณผํ•˜๋ฉด ์•ˆ๋˜๋Š” ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋ง์„ ํ†ตํ•œ ์žฌ์ ‘์†์„ ํ•˜๋˜๊ฐ€ ๋‹ค์Œ ์ฒ˜๋ฆฌ๊ฐ€ ์š”์ฒญ๋  ๋•Œ๊นŒ์ง€ ์ ‘์† ๋Š๊น€์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผํ•œ๋‹ค.

์›น GET ์š”์ฒญ์˜ ์˜ˆ์ œ error ํ•ธ๋“ค๋ง ์ฐธ๊ณ .
const http = require("http");
const req = http.request( {host:"ip", path:"/"}, (res) => {
  let text = "";
  res.on("data", (chunk) => {
    text += chunk;
  });
  res.on("close", () => {
    console.log(text);
  });
  res.on("error", () => {
    //์˜ˆ๋ฅผ๋“ค๋ฉด ์—ฌ๊ธฐ์— ํšŸ์ˆ˜์ œํ•œ, ์ง€์—ฐ๋Œ€๊ธฐ, req.end(); ํ˜•ํƒœ๋กœ ์“ด๋‹ค
  });
});
req.on("timeout", () => {
  //์˜ˆ๋ฅผ๋“ค๋ฉด ์ด๋Ÿฌํ•œ ์ค‘๋ณต๋˜๋Š” ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ์„ ํŠน์ • ํ•จ์ˆ˜๋กœ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
});
req.on("error", (e) => {
  //์˜ˆ๋ฅผ๋“ค๋ฉด ์ด๋Ÿฌํ•œ ์ค‘๋ณต๋˜๋Š” ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ์„ ํŠน์ • ํ•จ์ˆ˜๋กœ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
});
req.end();

3.3. ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ[ํŽธ์ง‘]

Node.js๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ฝ”์–ด ๊ฐฏ์ˆ˜๋งŒํผ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๊ณ  ๋ผ์šฐํ„ฐ๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋“ฑ์œผ๋กœ ์š”์ฒญ์„ ๊ฐ ํ”„๋กœ์„ธ์Šค๋กœ ๋ถ„์‚ฐ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹ค๋งŒ ์„œ๋ฒ„์—์„œ Node.js ํ•˜๋‚˜๋งŒ ๋Œ๋ฆฌ์ง€๋Š” ์•Š๊ณ  Node.js๋Š” CPU๋ณด๋‹ค๋Š” I/O์— ์œ ๋ฆฌํ•œ ๋…€์„์ด๋ฏ€๋กœ ๊ผญ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ์„ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๋Š” DB ๋“ฑ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์ž์›์„ ์–‘๋ณดํ•ด์ฃผ์ž. ๋ฌผ๋ก  ์ปจํ…์ธ  ๋”œ๋ฆฌ๋ฒ„๋ฆฌ ์„œ๋ฒ„ ๊ฐ™์ด ์–‘๋ณดํ•ด ์ค„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ๋‹ค.

4. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €[ํŽธ์ง‘]

4.1. ๊ณต์‹ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €[ํŽธ์ง‘]

4.1.1. npm[ํŽธ์ง‘]

Node.js Package Manager์˜ ์•ฝ์ž๋กœ, ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋Š” ์ด๊ณณ์ด๋‹ค.

2010๋…„ 1์›”์— ๋„์ž…๋œ Node.js ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ด๋ฉฐ, Java์˜ Maven, Python์˜ pip ์ •๋„์˜ ์ž…์ง€๋ฅผ ๊ฐ€์ง„ ํ”Œ๋žซํผ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋Œ€๋ถ€๋ถ„ Node.js์™€ ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.

4.2. ๋น„๊ณต์‹ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €[ํŽธ์ง‘]

4.2.1. yarn[ํŽธ์ง‘]

Facebook์—์„œ 2016๋…„ 8์›”์— ๋ฐœํ‘œํ•œ ํŒจํ‚ค์ง€ ๋ฐ ๋ฐฐํฌ ๊ด€๋ฆฌ์ž์ด๋‹ค. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋Š” ์ด๊ณณ์ด๋‹ค.

์ดˆ์ฐฝ๊ธฐ์—๋Š” npm์„ ์••๋„ํ•˜๋Š” ์„ฑ๋Šฅ์œผ๋กœ ์ธ๊ธฐ๋ฅผ ๋Œ์—ˆ๋Š”๋ฐ, 2020๋…„ ํ˜„์žฌ๋Š” npm์ด ๊ฐœ์„ ์„ ๊ฑฐ๋“ญํ•˜์—ฌ ์„ค์น˜ ๋ฐ ๋งํฌ ํผํฌ๋จผ์Šค ์ธก๋ฉด์—์„œ npm๊ณผ yarn์€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.

๋‹ค๋งŒ yarn์˜ ํŒจํ‚ค์ง€ ๋งํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒ npm๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์˜์กด์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

Yarn ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜„์žฌ node_modules์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `.pnp.js` ๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ์‹์˜ ํ†ตํ•ฉ ์˜์กด์„ฑ ํŒŒ์ผ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•˜๊ณ  ์žˆ๊ณ , ์ด๋Š” yarn 2๋ฒ„์ „๋Œ€์—์„œ ์ด์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

4.2.2. ๊ธฐํƒ€[ํŽธ์ง‘]

์ด์™ธ์—๋„ Bower, jspm๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ์—ฌ๋‹ด[ํŽธ์ง‘]

  • JavaScript์˜ ์ธ์‹์ด '์‰ฌ์šด ์–ธ์–ด'์ด๋‹ค ๋ณด๋‹ˆ, JavaScript๋กœ ์„œ๋ฒ„๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง๋งŒ ๋“ฃ๊ณ  ๋„์ „ํ–ˆ๋‹ค๊ฐ€ ํ—ฌ๊ฒŒ์ดํŠธ๋ฅผ ๊ฒฝํ—˜ํ•˜๋Š” ์ด๋“ค์ด ๋งŽ๋‹ค. ํ—Œ๋ฐ ์•ˆํƒ€๊น๊ฒŒ๋„ JavaScript๋Š” '๋‚œํ•ดํ•œ' ์–ธ์–ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์ด ๊ทธ๋ƒฅ ์—๋Ÿฌ๋ฅผ ๋‚ด๊ณ  ์‹คํ–‰์„ ๋ฉˆ์ถฐ ๋ฒ„๋ฆฌ๋Š” ๋ฒ„๊ทธ๋ฅผ JavaScript๋Š” ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์œผ๋กœ๋ผ๋„ ์–ด๋–ป๊ฒŒ๋“  ์‹คํ–‰ํ•ด๋ฒ„๋ฆฐ๋‹ค.[7][8] ํŠนํžˆ this ๊ฐ์ฒด์™€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ์นด์˜ค์Šค ๊ทธ ์ž์ฒด์ธ๋ฐ ์ด ๋‘˜์„ ์•ˆ ์“ธ ์ˆ˜๋„ ์—†๋‹ค.
  • ๋‚˜๋ฌด์œ„ํ‚ค๋Š” ์ด Node.js์™€ Node.js์—์„œ ๊ฐ€์žฅ ํฐ ๊ทœ๋ชจ์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ธ Express๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ๋‹ค.
  • 2016๋…„ 6.0 ๋ฒ„์ „๋ถ€ํ„ฐ ES6 ๋ฌธ๋ฒ•์ด ๋Œ€๊ฑฐ ์ถ”๊ฐ€๋˜๋ฉด์„œ ES6 Promise๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ES7์—์„œ๋Š” Promise ํŒจํ„ด์„ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” async/await ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ํŠนํžˆ async/await๋Š” ํ‚ค์›Œ๋“œ ํ•˜๋‚˜ ์ถ”๊ฐ€๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์‹์œผ๋กœ ์งค ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.[9] ๊ธฐ์กด Promise์™€์˜ ์กฐํ•ฉ๋„ ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ VSCode ๊ธฐ์ค€์—์„œ ๋””๋ฒ„๊น…์„ ํ• ๋•Œ ๋น„๋™๊ธฐํ•จ์ˆ˜๋กœ ์ง„์ž…ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค์—์„œ C# ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํƒœ์Šคํฌ ์ฒ˜๋ฆฌ๋ชจ๋“ˆ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • 12.0 ๋ฒ„์ „๋ถ€ํ„ฐ ES Modules๋„ ์‹คํ—˜์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋‹ค๋งŒ ์ง€๊ธˆ๊นŒ์ง€ CommonJS ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋“ค์ด ๋งŽ์ด ์กด์žฌํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ 14.0 ๋ฒ„์ „๊นŒ์ง€๋„ CommonJS ์ด๋‹ค.
  • 6.0๋ถ€ํ„ฐ XP/Vista๋ฅผ, 14.0๋ถ€ํ„ฐ Windows 7์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค(...). ๋”ฐ๋ผ์„œ Windows XP ๋“ฑ์—์„œ ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๊ฑฐ๋‚˜ Windows 7 ๊ฐ€์ƒ ๋จธ์‹ ์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

5.1. Node.js๋Š” ํ”„๋ ˆ์ž„์›Œํฌ?[ํŽธ์ง‘]

์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ‘œํ˜„๋˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ,[10] Node.js๋Š” JavaScript ์—”์ง„์ธ V8์— ์Šค์ผ€์ฅด๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(libuv)๋ฅผ ์—ฐ๊ฒฐํ•œ ์‘์šฉ ๋Ÿฐํƒ€์ž„ ํ”Œ๋žซํผ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ณผ๊ฑฐ Node.js ํ™ˆํŽ˜์ด์ง€์˜ About์—๋Š” "As an asynchronous event driven framework, Node.js is..." ํ•˜๋Š” ์„ค๋ช…์ด ์žˆ๋Š”๋ฐ ์ด๋Š” Node.js๊ฐ€ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ์— ์žˆ์–ด ํŠน์ •ํ•˜๊ฒŒ ์ง€์ •๋œ ๋””์ž์ธ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ ์„ค๋ช…์ด๋‹ค. ๊ทผ๋ฐ ์ด๊ฒŒ Node.js์— ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ง€ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๊ฐ€ Node.js๋ผ๋Š” ๋ง์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ €๊ฑธ ๊ทผ๊ฑฐ๋กœ Node.js๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ๋ถˆ๋ ค์•ผ ํ•œ๋‹ค๋ฉด ํŠน์ • ๋ฐฉ๋ฒ•๋ก ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋””์ž์ธ์„ ๋‚ด์žฅํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ํ˜„๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ ๋ถˆ๋ ค์•ผ ํ•œ๋‹ค. ๋…ผ๋ž€์ด ๋งŽ๊ธฐ๋Š” ๋งŽ์•˜๋Š”์ง€ ํ˜„์žฌ์˜ ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” ์•„์˜ˆ "As an asynchronous event driven JavaScript runtime"๋กœ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค. ๊ตณ์ด 6 ๋ฒ„์ „๋Œ€์— ์™€์„œ ํ™ˆํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ฐ”๊พผ ๊ฒƒ์œผ๋กœ ๋ณด์•„, ์ด์ „์˜ ๋ฌธ๊ตฌ๊ฐ€ ์‹ค์ œ๋กœ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผ์ผฐ๋‹ค๋Š” ์ ์„ ์ธ์ •ํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด์ œ ํ™ˆํŽ˜์ด์ง€์˜ ๋‚ด์šฉ๋„ ์ •์ •๋˜์—ˆ์œผ๋‹ˆ, Node.js๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ช…๋ฐฑํ•œ ์ž˜๋ชป์ด๋ผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

5.2. ์„ฑ๋Šฅ ์ด์•ผ๊ธฐ[ํŽธ์ง‘]

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ธํ•˜์—ฌ I/O ์ฒ˜๋ฆฌ๊ฐ€ ๊ณ ์„ฑ๋Šฅ์ด๊ณ  ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ตฌ๊ธ€ V8๋„ ๊ฝค ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” JIT ๊ตฌํ˜„์ด์ง€๋งŒ ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜๋Š” JavaScript ์ฝ”๋“œ๋Š” ๋ฌด์กฐ๊ฑด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ œ์•ฝ์ด ๊ฑธ๋ ค์žˆ์–ด ๋ณ‘๋ ฌ์—ฐ์‚ฐ์—๋Š” ์ทจ์•ฝํ•˜๋‹ค. ๋‹จ, Node.js์—์„œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ œ์•ฝ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์— ํฌํ•จ๋œ ์‚ฌ์–‘์ด๋‹ค. ๋ณต์žกํ•œ ๋น„๋™๊ธฐ I/O ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ JavaScript๋กœ ์ž‘์„ฑํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฌผ์˜ ์‹คํ–‰ ์†๋„์™€ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ์ธก๋ฉด์—์„œ ์ข‹๋‹ค๋Š” ๊ฒƒ์ด Node.js์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ๊ฐœ๋…์ด๋ฉฐ, CPU์˜ ๋†’์€ ์—ฐ์‚ฐ๋ ฅ์„ ์š”๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ Node.js๋กœ ์งœ๋ฉด ์˜ ์ข‹์ง€ ์•Š์€ ์„ฑ๋Šฅ์ด ๋‚˜์˜จ๋‹ค. ์ž‘์„ฑ์ž์ธ Ryan Dahl์€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์—ฐ์‚ฐ๋ ฅ์ด ์ค‘์š”ํ•œ ์š”์†Œ๋Š” C๋กœ ์งœ์„œ ๋ถ™์ด๋ผ๋Š” ์ƒ์‹์ ์ธ ์‚ฌ์‹ค์„ ์ด์•ผ๊ธฐํ–ˆ๋‹ค.

Node.js๊ฐ€ ๊ณ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๋Š” ๋ถ„์•ผ๋Š” ๋น„๊ต์  ๊ฐ€๋ฒผ์šด I/O๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์›น ์„œ๋ฒ„๋‚˜ ๋™์˜์ƒ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ์˜ ์ปจํ…์ธ  ๋”œ๋ฆฌ๋ฒ„๋ฆฌ ์„œ๋ฒ„๋‹ค. ์‚ฌ์‹ค C๋กœ ๋˜‘๊ฐ™์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด Node.js๋ณด๋‹ค ๋นจ๋ผ์ง€์ง€๋งŒ ์ฝ”๋”ฉ ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ํŽธ์ด๋‹ค. ๋‹ค๋งŒ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž์ฒด์— ๋Œ€ํ•ด์„œ๋Š” Node.js๋งŒ์˜ ์žฅ์ ์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค.[11] ๋˜ํ•œ, Boost.Asio์™€ ๊ฐ™์ด ์ž˜ ์„ค๊ณ„๋œ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋”๋ผ๋„ Node.js๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜๋”๋ผ๋„ C++๊ฐ€ ๋น„๊ต์  ์–ด๋ ต๊ณ  ๋ณต์žกํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‚ฐ์ด ์ž˜ ์•ˆ ๋  ๋ฟ์ด๋‹ค.

6. ๊ฐ™์ด ๋ณด๊ธฐ[ํŽธ์ง‘]

6.1. ์ฐธ์กฐ ๋ฌธ์„œ[ํŽธ์ง‘]

6.2. ํ”„๋ ˆ์ž„์›Œํฌ[ํŽธ์ง‘]

  • Socket.IO - Node.js์˜ ๋น„๋™๊ธฐ ๋ฒ”์šฉ ์›น์†Œ์ผ“ ํ”„๋ ˆ์ž„์›Œํฌ
  • Express - Node.js ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • Electron - Node.js์™€ HTML๋กœ ์ž‘์„ฑ๋œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐ์Šคํฌํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” Wrapper ํ”„๋ ˆ์ž„์›Œํฌ.[12][13]

6.3. ์‡ผ์ผ€์ด์Šค[ํŽธ์ง‘]

6.4. ๊ธฐํƒ€[ํŽธ์ง‘]

[1] ์ดˆ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๋“ค์„ ๋ชจ์œผ๊ณ  Node.js์˜ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ฃผ๋„ํ–ˆ์œผ๋‚˜ 2012๋…„ 1์›”์— ๋ฌผ๋Ÿฌ๋‚ฌ๋‹ค.
[2] node-pre-gyp ๋“ฑ
[3] ์œˆ๋„์šฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
[4] ์•„์‰ฝ๊ฒŒ๋„ ์•„์น˜๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์œ„์— ๋‚˜์™€ ์žˆ๋Š” nvm์„ ์“ฐ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
[5] ๋‹น์—ฐํ•œ๊ฑฐ์ง€๋งŒ filename์— ์‹คํ–‰ํ•  ํŒŒ์ผ์˜ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. cd๋กœ ํ•ด๋‹น ํŒŒ์ผ์ด ๋“ค์–ด์žˆ๋Š” ํด๋”๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋” ํŽธํ•˜๋‹ค.
[6] ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM API์™€ JavaScript ์—”์ง„์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค.
[7] ์˜ˆ๋ฅผ ๋“ค์–ด for .. in ๋ฌธ๋ฒ•์—์„œ ์ธ๋ฑ์Šค ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€์„œ i = '1' ์ผ ๋•Œ i + 1 ์˜ ๊ฐ’์ด 2๊ฐ€ ์•„๋‹ˆ๋ผ 11(1 ๋’ค์— 1์„ ๋ง๋ถ™์ž„)์ด ๋˜๋Š” ๋“ฑ.
[8] ์š”์ƒˆ๋Š” ESLint ๋“ฑ์„ ์จ์„œ ์ž์ž˜ํ•œ ์‹ค์ˆ˜๋“ค์€ ์•„์˜ˆ ์—๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
[9] ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ฐ˜๋ณต๋ฌธ์„ ํ•˜๋ ค๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง„๋‹ค.
[10] ์‚ฌ์‹ค ํ•ด์™ธ์—์„œ๋„ ์กฐ๊ธˆ์”ฉ ๋‚˜์˜ค๋Š” ์ด์•ผ๊ธฐ๋‹ค.
[11] C#์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, Java๋‚˜ ๋ณต์žกํ•˜๊ธฐ๋กœ ์œ ๋ช…ํ•œ C++๋„ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„์ง ์ดˆ์•ˆ์ธ C++20๋„ ์ด๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•  ์˜ˆ์ •์ด๋‹ค.
[12] ๊ณผ๊ฑฐ์—๋Š” nw.js๋ผ๋Š” ๋น„์Šทํ•œ ๋ชฉ์ ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ž์ฃผ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋‚˜, ํ˜„์žฌ ๊ฑฐ์˜ ์‚ฌ์žฅ๋˜์—ˆ๋‹ค.
[13] Visual Studio Code, Atom, Discord, Skype, Slack, Twitch ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ด ๋ชจ๋‘ ์ด Electron์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
[14] ๋„ํˆฌ๋„ Node.js์˜ Express ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ WebSocket ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒŒ์ž„์ด๋‹ค. ์ฐธ๊ณ ๋กœ cluster ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ๋™๋œ๋‹ค. ์ดํ•˜ ๋ฌธ์„œ ์ฐธ์กฐ.
[15] Node.js์˜ ์ผ๋ถ€ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Node.js์˜ ๊ฐœ๋ฐœ์ž ์ค‘ ํ•œ ๋ช…์ด ๋งŒ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์ด๋‹ค.