์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
Node.jsยฎ | |
์ข
๋ฅ | JavaScript ๋ฐํ์(์คํํ๊ฒฝ) |
๋ผ์ด์ ์ค | |
๊ฐ๋ฐ | Node.js contributors |
๋ฒ์ | 15 |
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 ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค.
๋น๋ฒํ 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์ ์ฐ๊ฒ ๋๋ค.
์์ค์ฝ๋์์ ์ง์ ๋น๋ํด์ ์ธ ์๋ ์๋ค. ์ด ๊ณณ์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค. ๋ค๋ง ๋ฐฉ๋ํ ๋ ธ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋น๋ํด์ผ ํ๊ธฐ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค๋ ์ ์ ๊ณ ๋ คํ์.์ฌ์ค ์์ค์์ ์ง์ ๋น๋ํ ์๊ฐ์ ํ ๋๋ฉด ์ด๋ฏธ ์๊ฐ ๊ฐ์ ๊ฑด ์๊ด์ด ์์ ๊ฒ์ด๋ค
๋ค๋ง Node.js๋ฅผ ์ด์ฉํด ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ํน์ ์น์ฌ์ดํธ๋ฅผ ์คํํ๊ฑฐ๋ ๋น๋ํ๋ค ๋ณด๋ฉด ํ๋ก๊ทธ๋จ๋ง๋ค ๋ค๋ฅธ ๋ ธ๋ ๋ฒ์ ์ ์ง์ํ๋ ๊ฒ์ ๊ฒฝํํ ์ ์๋๋ฐ, ์ด ๋๋ NVM(Node Version Manager)์ ์ด์ฉํด์ ์ฝ๊ฒ ๋ค๋ฅธ ๋ฒ์ ์ node.js๋ฅผ ์ค์นํ๊ณ ์ ํํ ์ ์๋ค. ์ฌ์ค ์ด ๋ชฉ์ ์ด ์๋๋ผ๋, node.js๋ฅผ ์ฝ๊ฒ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด nvm์ ์ฐ๊ฒ ๋๋ค.
์์ค์ฝ๋์์ ์ง์ ๋น๋ํด์ ์ธ ์๋ ์๋ค. ์ด ๊ณณ์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค. ๋ค๋ง ๋ฐฉ๋ํ ๋ ธ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋น๋ํด์ผ ํ๊ธฐ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค๋ ์ ์ ๊ณ ๋ คํ์.
2.1.1. NVM์ ์ด์ฉํ ์ค์น[ํธ์ง]
bash๊ฐ ์ง์๋๋ ํ๊ฒฝ์ธ ๋ฆฌ๋
์ค, ๋งฅ[3]์์๋ ์๋ ์ฝ๋ ๋ ์ค ์ค ํ๋๋ฅผ ํฐ๋ฏธ๋์ ์
๋ ฅํ์ฌ ์ค์นํ ์ ์๋ค.
์ค์น ์ดํ ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด Node.js๋ฅผ ์ค์นํ ์ ์๋ค.
$ 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์์ ์ ๊ณตํ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฒ์ ๋ณ๋ก ํจํค์ง ๋งค๋์ ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ ์ธ ์ ์๋ค. ์ฐ๋ถํฌ, ๋ฐ๋น์ ๋ฆฌ๋
์ค์์๋ ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค.
๋ง์ฝ ๋ค๋ฅธ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ ์ด๋ค๋ฉด ์ด ๊ณณ์์ ์ง์ ์์ ์ ๋ฐฐํฌํ์ ๋ง๋ ๋ช ๋ น์ค์ ์ฐพ์ ์ ๋ ฅํ์.[4]
$ 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๊ฐ ์ค์น๋ ์ํ์์ ์๋ฌด ์๋ํฐ๋ ๋์ฐ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ๋๋ค. ๋ฉ๋ชจ์ฅ๋ ๊ด์ฐฎ๋ค.
์ ์ฅํ๊ณ ํฐ๋ฏธ๋ ๋ฑ์์ 'node filename'[5] ์ด๋ผ๊ณ ์ ๋ ฅํด์ฃผ๊ณ ๋์, ์ญ์ ์๋ฌด ๋ธ๋ผ์ฐ์ ๋ ์ผ๊ณ localhost:8080์ผ๋ก ๋ค์ด๊ฐ๋ฉด ์๋ง 'Hello, world!'๋ผ๊ณ ๋ฐ ๊ฒ์ด๋ค.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/');
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! undefinedHello, 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 ์ด์ฌ์๋ ์ฝ๋ฐฑ ์ง์ฅ์ ๊ฒฝํํ๊ฒ ๋๋ค. ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด ์ฝ๋๊ฐ ๋ฌดํ ๋ค์ฌ์ฐ๊ธฐ๋ก ์์ฑ๋ผ์ ์์ค์ฝ๋๊ฐ ๋๊ฐ์ ์ผ๋ก ์ฐ์ฌ์ง๋ ํ์์ ๋งํ๋๋ฐ, ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ต๋ช ํจ์๋ฅผ ํฌ๊ธฐํ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ๋ ๊ฒ์ด ์๋ค.
์ฝ๋ฐฑ ์ง์ฅ์์ ๋ฒ์ด๋๊ธฐ ์ํ ๋ฐ๋ฒ๋ฅ์ ์ฐ๋ฌผ๋ก Generator์ Promise๊ฐ ๋ฑ์ฅํ์๋ค. ์ดํ ES2017์์๋ Promise๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ async/await ํค์๋๊ฐ ๋์ ๋์ด ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฑฐ์ ์ฐจ์ด๊ฐ ์๋ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ์ ์ฝ๋๋ฅผ ์ธ ์ ์๊ฒ ๋์๋ค.
์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฆฌ์กํฐ ํจํด์ ์ํ 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 ํธ๋ค๋ง ์ฐธ๊ณ .
์น 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[ํธ์ง]
4.2. ๋น๊ณต์ ํจํค์ง ๋งค๋์ [ํธ์ง]
4.2.1. yarn[ํธ์ง]
Facebook์์ 2016๋
8์์ ๋ฐํํ ํจํค์ง ๋ฐ ๋ฐฐํฌ ๊ด๋ฆฌ์์ด๋ค. ๊ณต์ ํํ์ด์ง๋ ์ด๊ณณ์ด๋ค.
์ด์ฐฝ๊ธฐ์๋ npm์ ์๋ํ๋ ์ฑ๋ฅ์ผ๋ก ์ธ๊ธฐ๋ฅผ ๋์๋๋ฐ, 2020๋ ํ์ฌ๋ npm์ด ๊ฐ์ ์ ๊ฑฐ๋ญํ์ฌ ์ค์น ๋ฐ ๋งํฌ ํผํฌ๋จผ์ค ์ธก๋ฉด์์ npm๊ณผ yarn์ ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํ๋ค.
๋ค๋ง yarn์ ํจํค์ง ๋งํฌ ์๊ณ ๋ฆฌ์ฆ ์ npm๊ณผ๋ ๋ฌ๋ฆฌ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ ์์กด์ฑ์ ๋ณด์ฅํ๋ค๊ณ ํ๋ค.
Yarn ๊ฐ๋ฐ์๋ค์ ํ์ฌ node_modules์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด `.pnp.js` ๋ผ๋ ์๋ก์ด ๋ฐฉ์์ ํตํฉ ์์กด์ฑ ํ์ผ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๊ณ ์๊ณ , ์ด๋ yarn 2๋ฒ์ ๋์์ ์ด์ฉํด๋ณผ ์ ์๋ค.
์ด์ฐฝ๊ธฐ์๋ npm์ ์๋ํ๋ ์ฑ๋ฅ์ผ๋ก ์ธ๊ธฐ๋ฅผ ๋์๋๋ฐ, 2020๋ ํ์ฌ๋ npm์ด ๊ฐ์ ์ ๊ฑฐ๋ญํ์ฌ ์ค์น ๋ฐ ๋งํฌ ํผํฌ๋จผ์ค ์ธก๋ฉด์์ npm๊ณผ yarn์ ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํ๋ค.
๋ค๋ง yarn์ ํจํค์ง ๋งํฌ ์๊ณ ๋ฆฌ์ฆ ์ npm๊ณผ๋ ๋ฌ๋ฆฌ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ ์์กด์ฑ์ ๋ณด์ฅํ๋ค๊ณ ํ๋ค.
Yarn ๊ฐ๋ฐ์๋ค์ ํ์ฌ node_modules์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด `.pnp.js` ๋ผ๋ ์๋ก์ด ๋ฐฉ์์ ํตํฉ ์์กด์ฑ ํ์ผ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๊ณ ์๊ณ , ์ด๋ yarn 2๋ฒ์ ๋์์ ์ด์ฉํด๋ณผ ์ ์๋ค.
4.2.2. ๊ธฐํ[ํธ์ง]
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๋ฅผ ํ๋ ์์ํฌ๋ก ํํํ๋ ๊ฒ์ ๋ช ๋ฐฑํ ์๋ชป์ด๋ผ ํ ์ ์์ ๊ฒ์ด๋ค.
๊ณผ๊ฑฐ 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++๊ฐ ๋น๊ต์ ์ด๋ ต๊ณ ๋ณต์กํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ์ฐ์ด ์ ์ ๋ ๋ฟ์ด๋ค.
Node.js๊ฐ ๊ณ ์ฑ๋ฅ์ ๋ฐํํ๋ ๋ถ์ผ๋ ๋น๊ต์ ๊ฐ๋ฒผ์ด I/O๊ฐ ๋ฐ์ํ๋ ๋๋ค์์ ์น ์๋ฒ๋ ๋์์, ์คํธ๋ฆฌ๋ฐ ๋ฑ์ ์ปจํ ์ธ ๋๋ฆฌ๋ฒ๋ฆฌ ์๋ฒ๋ค. ์ฌ์ค C๋ก ๋๊ฐ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ฉด Node.js๋ณด๋ค ๋นจ๋ผ์ง์ง๋ง ์ฝ๋ฉ ๋์ด๋๊ฐ ๋์ ํธ์ด๋ค. ๋ค๋ง, ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ฒด์ ๋ํด์๋ Node.js๋ง์ ์ฅ์ ์ด๋ผ๊ณ ๋งํ๊ธฐ๋ ํ๋ค๋ค.[11] ๋ํ, Boost.Asio์ ๊ฐ์ด ์ ์ค๊ณ๋ C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋คํธ์ํฌ์ ๋ํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ฉฐ ๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ผ๋ Node.js๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ตฌํ๋๋๋ผ๋ C++๊ฐ ๋น๊ต์ ์ด๋ ต๊ณ ๋ณต์กํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ์ฐ์ด ์ ์ ๋ ๋ฟ์ด๋ค.
6. ๊ฐ์ด ๋ณด๊ธฐ[ํธ์ง]
6.1. ์ฐธ์กฐ ๋ฌธ์[ํธ์ง]
6.2. ํ๋ ์์ํฌ[ํธ์ง]
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์ ๊ฐ๋ฐ์ ์ค ํ ๋ช
์ด ๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ/ํ์
์คํฌ๋ฆฝํธ ๋ฐํ์์ด๋ค.