JavaScript๋ก ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ํ๋ซํผ์ธ Node.js 17.0์ด ์ถ์๋์์ต๋๋ค. Node.js 17.0์ 2022๋ 16์๊น์ง ์ ๋ฐ์ดํธ๋๋ ์ ๊ท ์ง์ ๋ถ๊ธฐ์ ๋๋ค. ๋ฉฐ์น ์์ Node.js 2024 ๋ธ๋์น์ ์์ ํ๊ฐ ์๋ฃ๋์ด LTS ์ํ๋ฅผ ๋ฐ๊ณ 14.0๋ 2023์๊น์ง ์ง์๋ฉ๋๋ค. ์ด์ Node.js 12.0 LTS ๋ถ๊ธฐ๋ 2022๋ XNUMX์๊น์ง, ์ด์ XNUMX LTS ๋ถ๊ธฐ๋ XNUMX๋ XNUMX์๊น์ง ์ ์ง ๊ด๋ฆฌ๋ฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ:
- V8 ์์ง์ด ๋ฒ์ 9.5๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
- Promise ๋น๋๊ธฐ ์ปดํจํ ์ธํฐํ์ด์ค ์ฌ์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ๋ณธ API์ ๋ณํ ๊ตฌํ์ด ๊ณ์๋์์ต๋๋ค. ์ด์ ์ ์ ์๋ Timers Promises ๋ฐ Streams Promises API ์ธ์๋ Node.js 17.0์๋ readline ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ ์ค์ฉ ์ฝ๋ Readline Promise API๊ฐ ๋์ ๋์์ต๋๋ค. import * as readline from 'node:readline/promises'; import { stdin์ ์ ๋ ฅ์ผ๋ก, stdout์ ์ถ๋ ฅ์ผ๋ก } from 'process'; const rl = readline.createInterface({ ์ ๋ ฅ, ์ถ๋ ฅ }); const answer = await rl.question('Node.js์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์?'); console.log('๊ท์คํ ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค: ${answer}'); rl.close();
- ์ ๊ณต๋ OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฒ์ 3.0์ผ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค(QUIC ํ๋กํ ์ฝ ์ง์์ด ํ์ฑํ๋ quictls/openssl ํฌํฌ ์ฌ์ฉ).
- ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๋ ์น๋ช ์ ์ธ ์ค๋ฅ์ ๋ํด Node.js ๋ฒ์ ์ด ์คํ ์ถ์ ์ ํ์๋๋์ง ํ์ธํ์ญ์์ค.
๋ํ Node.js์ ํ์ฌ ๋ธ๋์น(CVE-2021-22959, CVE-2021-22960)์์ ๋ ๊ฐ์ง ์ทจ์ฝ์ ์ด ์ ๊ฑฐ๋์ด HRS(HTTP ์์ฒญ ์ค๋จธ๊ธ๋ง) ํด๋์ค์ ๊ณต๊ฒฉ์ ์ํํ ์ ์์ต๋๋ค. ํน๋ณํ ์ค๊ณ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ ์กํ์ฌ ํ๋ฐํธ์๋์ ๋ฐฑ์๋ ์ฌ์ด์ ๋์ผํ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ์ฉ์์ ์์ฒญ ๋ด์ฉ์ ๋ผ์ ๋ฃ์ ์ ์์ต๋๋ค(์: ๋ค๋ฅธ ์ฌ์ฉ์์ ์ธ์ ์์ ์ ์ฑ JavaScript ์ฝ๋๋ฅผ ๋์ฒดํ ์ ์์). ์์ธํ ๋ด์ฉ์ ์ถํ ๊ณต๊ฐ๋๊ฒ ์ง๋ง ํ์ฌ๋ก์๋ HTTP ํค๋ ์ด๋ฆ๊ณผ ์ฝ๋ก ์ฌ์ด์ ๊ณต๋ฐฑ ์ฒ๋ฆฌ๊ฐ ์๋ชป๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ์ ๋ฌ ์ ์ฌ์ฉ๋๋ ๋งค๊ฐ๋ณ์ ๋ธ๋ก์ ์บ๋ฆฌ์ง ๋ฆฌํด ๋ฐ ์ค ๋ฐ๊ฟ ๋ฌธ์ ์ฒ๋ฆฌ๊ฐ ์๋ก ๋ค๋ฆ ๋๋ค. "chunked" ๋ชจ๋์์ ์ฒญํฌ์ ์์ฒญ ๋ณธ๋ฌธ. ".
Node.js ํ๋ซํผ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ ์ง ๊ด๋ฆฌ์ ์ผ๋ฐ ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ ๋คํธ์ํฌ ํ๋ก๊ทธ๋จ ์์ฑ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. Node.js์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3 ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ ๊ตฌํ์ด ํฌํจ๋ ๋ชจ๋, ํตํฉ์ฉ ๋ชจ๋์ ์ฐพ์ ์ ์๋ ๋๊ท๋ชจ ๋ชจ๋ ๋ชจ์์ด ์ค๋น๋์์ต๋๋ค. ๋ค์ํ ์น ํ๋ ์์ํฌ, WebSocket ๋ฐ Ajax ํธ๋ค๋ฌ, DBMS ์ปค๋ฅํฐ(MySQL, PostgreSQL, SQLite, MongoDB), ํ ํ๋ฆฟ ์์ง, CSS ์์ง, ์ํธํ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ์ธ์ฆ ์์คํ (OAuth) ๊ตฌํ, XML ํ์.
๋ง์ ์์ ๋ณ๋ ฌ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด Node.js๋ ๋น์ฐจ๋จ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ์ฝ๋ฐฑ ํธ๋ค๋ฌ ์ ์์ ๊ธฐ๋ฐํ ๋น๋๊ธฐ ์ฝ๋ ์คํ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. ๋ฉํฐํ๋ ์ฑ ์ฐ๊ฒฐ์ ์ง์๋๋ ๋ฐฉ๋ฒ์ epoll, kqueue, /dev/poll ๋ฐ select์ ๋๋ค. ์ฐ๊ฒฐ ๋ค์คํ๋ฅผ ์ํด Unix ์์คํ ์ libev ๋ฐ Windows์ IOCP์ ๋ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ธ libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. libeio ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ํ์ ์์ฑํ๊ณ c-ares๋ฅผ ํตํฉํ์ฌ ๋น์ฐจ๋จ ๋ชจ๋์์ DNS ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ์ฐจ๋จ์ ์ ๋ฐํ๋ ๋ชจ๋ ์์คํ ํธ์ถ์ ์ค๋ ๋ ํ ๋ด์์ ์คํ๋ ๋ค์ ์ ํธ ์ฒ๋ฆฌ๊ธฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฆ ์๋ ํ์ดํ(ํ์ดํ)๋ฅผ ํตํด ๋ค์ ์ ์กํฉ๋๋ค. JavaScript ์ฝ๋์ ์คํ์ Google์์ ๊ฐ๋ฐํ V8 ์์ง์ ์ฌ์ฉํ์ฌ ์ ๊ณต๋ฉ๋๋ค(๋ํ Microsoft๋ Chakra-Core ์์ง์ผ๋ก Node.js ๋ฒ์ ์ ๊ฐ๋ฐ ์ค์ ๋๋ค).
๋ณธ์ง์ ์ผ๋ก Node.js๋ Perl AnyEvent, Ruby Event Machine, Python Twisted ํ๋ ์์ํฌ ๋ฐ Tcl ์ด๋ฒคํธ ๊ตฌํ๊ณผ ์ ์ฌํ์ง๋ง Node.js์ ์ด๋ฒคํธ ๋ฃจํ๋ ๊ฐ๋ฐ์์๊ฒ ์จ๊ฒจ์ ธ ์์ผ๋ฉฐ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ ์ฌํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์. node.js์ฉ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ๋ ์๋ฅผ ๋ค์ด "var result = db.query("select..");"๋ฅผ ์ํํ๋ ๋์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ธ๋ถ ์ฌํญ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์์
์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ํ์ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ์ ํจ๊ป Node.js๋ ๋น๋๊ธฐ ์คํ ์์น์ ์ฌ์ฉํฉ๋๋ค. ์ฝ๋๋ "db.query("select..", function (result) {result processing});"๋ก ๋ณํ๋๋ฉฐ, ์ฌ๊ธฐ์ ์ ์ด๋ ์ถ๊ฐ ์ฝ๋๋ก ์ฆ์ ์ ๋ฌ๋๊ณ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ถ์ฒ : opennet.ru