JavaScript๋ก ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ํ๋ซํผ์ธ Node.js 20.0์ด ์ถ์๋์์ต๋๋ค. Node.js 20.0์ ์ฅ๊ธฐ ์ง์ ๋ถ๊ธฐ์ ํ ๋น๋์์ง๋ง ์ด ์ํ๋ ์์ ํ ํ 20์๊น์ง ํ ๋น๋์ง ์์ต๋๋ค. Node.js 30.x๋ 2026๋ 18์ 2025์ผ๊น์ง ์ง์๋ฉ๋๋ค. ์ด์ Node.js 16.x LTS ๋ถ๊ธฐ์ ์ ์ง ๊ด๋ฆฌ๋ 2023๋ 14์๊น์ง, ์ด์ 30.x LTS ๋ถ๊ธฐ๋ 19๋ 1์๊น์ง ์ง์๋ฉ๋๋ค. XNUMX.x LTS ๋ถ๊ธฐ๋ XNUMX์ XNUMX์ผ์, Node.js XNUMX.x ์์ ๋ถ๊ธฐ๋ XNUMX์ XNUMX์ผ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ค๋จ๋ฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ:
- V8 ์์ง์ Chromium 11.3์์ ์ฌ์ฉ๋๋ ๋ฒ์ 113์ผ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค. Chromium 19 ์์ง์ ์ฌ์ฉํ๋ Node.js 107 ๋ถ๊ธฐ์ ๋น๊ตํ ๋ณ๊ฒฝ ์ฌํญ ์ค String.prototype.isWellFormed ๋ฐ toWellFormed ํจ์์ธ Array.prototype TypedArray.prototype ๋ฉ์๋๋ Array ๋ฐ TypedArray ๊ฐ์ฒด์ ๋ณ๊ฒฝ ์ ๋ณต์ฌ, RegExp์ "v" ํ๋๊ทธ, ArrayBuffer ํฌ๊ธฐ ์กฐ์ ๋ฐ SharedArrayBuffer ํฌ๊ธฐ ์ฆ๊ฐ ์ง์, WebAssembly์ ๊ผฌ๋ฆฌ ํธ์ถ๋ก ์๋ํฉ๋๋ค.
- ์คํ ์ค์ ํน์ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ํํ ์ ์๋ ์คํ์ ์ธ ๊ถํ ๋ชจ๋ธ ๋ฉ์ปค๋์ฆ์ด ์ ์๋ฉ๋๋ค. ๊ถํ ๋ชจ๋ธ ์ง์์ ์คํํ ๋ "--experimental-permission" ํ๋๊ทธ๋ฅผ ์ง์ ํ์ฌ ํ์ฑํ๋ฉ๋๋ค. ์ด๊ธฐ ๊ตฌํ์์ FS์ ํน์ ๋ถ๋ถ, ํ์ ํ๋ก์ธ์ค(--allow-child-process)์ ๋ํ ์ฐ๊ธฐ(--allow-fs-write) ๋ฐ ์ฝ๊ธฐ(--allow-fs-read) ์ก์ธ์ค๋ฅผ ์ ํํ๋ ์ต์
์ด ์ ์๋์์ต๋๋ค. , ์ ๋์จ(--no-addons ) ๋ฐ ์ค๋ ๋(--allow-worker). ์๋ฅผ ๋ค์ด /tmp ๋๋ ํ ๋ฆฌ์ ์ฐ๊ธฐ ๋ฐ /home/index.js ํ์ผ ์ฝ๊ธฐ๋ฅผ ํ์ฉํ๋ ค๋ฉด ๋ค์์ ์ง์ ํ ์ ์์ต๋๋ค. node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read =/home/index.js ์ธ๋ฑ์ค .js
์ก์ธ์ค๋ฅผ ํ์ธํ๋ ค๋ฉด process.permission.has() ๋ฉ์๋(์: "process.permission.has('fs.write',"/tmp/test"))๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- "--experimental-loader" ์ต์ ์ ํตํด ๋ก๋๋ ECMAScript ์ธ๋ถ ๋ชจ๋(ESM)์ฉ ํธ๋ค๋ฌ๋ ์ด์ ๋ฉ์ธ ์ค๋ ๋์ ๋ถ๋ฆฌ๋ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ก๋๋ ESM ๋ชจ๋์ ๊ต์ฐจ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก import.meta.resolve() ๋ฉ์๋๋ ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ํธ์ถ๋ ๋ ๋๊ธฐ์์ผ๋ก ์คํ๋ฉ๋๋ค. Node.js์ ๋ค์ ๋ถ๊ธฐ ์ค ํ๋์์ ESM ๋ก๋ฉ ์ง์์ด ์์ ์ ์ธ ๊ธฐ๋ฅ ๋ฒ์ฃผ๋ก ์ด๋ํ ์์ ์ ๋๋ค.
- TAP(Test Anything Protocol) ํ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ JavaScript ํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ์คํํ๋๋ก ์ค๊ณ๋ node:test(test_runner) ๋ชจ๋์ด ์์ ์ผ๋ก ์ด๋๋์์ต๋๋ค.
- ์๋ก์ด ๋ถ๊ธฐ๋ฅผ ์ค๋นํ๋ฉด์ URL ๊ตฌ๋ฌธ ๋ถ์, fetch() ๋ฐ EventTarget์ ๋น๋กฏํ ๋ค์ํ ๋ฐํ์ ๊ตฌ์ฑ ์์์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ณ๋์ ์ฑ๋ฅ ํ์ด ๊ตฌ์ฑ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด EventTarget์ ์ด๊ธฐํํ๋ ์ค๋ฒํค๋๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ณ URL.canParse() ๋ฉ์๋์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์์ผ๋ฉฐ ํ์ด๋จธ์ ํจ์จ์ฑ์ด ํฅ์๋์์ต๋๋ค. ๋ํ C ++๋ก ์์ฑ๋ ๊ณ ์ฑ๋ฅ URL ํ์ Ada 2.0 ๋ฆด๋ฆฌ์ค๊ฐ ๊ตฌ์ฑ์ ํฌํจ๋ฉ๋๋ค.
- ๋จ์ผ ์คํ ํ์ผ(SEA, Single Executable Applications) ํํ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๊ธฐ ์ํ ์คํ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์ด ๊ณ์๋์์ต๋๋ค. ์ด์ ์คํ ํ์ผ์ ๋ง๋ค๋ ค๋ฉด JavaScript ํ์ผ์ ๋์ฒดํ๋ ๋์ JSON ๊ตฌ์ฑ ํ์ผ์์ ์์ฑ๋ Blob์ ๋์ฒดํด์ผ ํฉ๋๋ค.
- ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ตฌํ๊ณผ Web Crypto API ํธํ์ฑ์ด ํฅ์๋์์ต๋๋ค.
- ARM64 ์์คํ ์ Windows์ ๋ํ ๊ณต์ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ๋ ๋ฆฝ ์คํํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ WASI(WebAssembly System Interface) ํ์ฅ์ ๋ํ ์ง์์ ์ธ ์ง์. WASI ์ง์์ ํ์ฑํํ๊ธฐ ์ํด ํน์ ๋ช ๋ น์ค ํ๋๊ทธ๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
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