JavaScript๋ก ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ํ๋ซํผ์ธ Node.js 21.0์ด ์ถ์๋์์ต๋๋ค. Node.js 21.0 ๋ธ๋์น๋ 6๊ฐ์ ๋์ ์ง์๋ฉ๋๋ค. ์์ผ๋ก ๋ฉฐ์น ๋ด์ Node.js 20 ๋ธ๋์น์ ์์ ํ๊ฐ ์๋ฃ๋์ด LTS ์ํ๋ฅผ ๋ฐ๊ฒ ๋๋ฉฐ 2026๋ 18.0์๊น์ง ์ง์๋ฉ๋๋ค. Node.js 2025์ ์ด์ LTS ๋ธ๋์น ์ ์ง ๊ด๋ฆฌ๋ 16.0๋ 2024์๊น์ง ์ง์๋๋ฉฐ, ๋ง์ง๋ง LTS ๋ธ๋์น XNUMX์ XNUMX๋ ์ ์ธ XNUMX๋ XNUMX์๊น์ง ์ ์ง๋ฉ๋๋ค.
์ฃผ์ ๊ฐ์ ์ฌํญ:
- Fetch API๋ ์์ ์ ์ผ๋ก ์ ์ธ๋์์ผ๋ฉฐ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๊ณ ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ ์ธก ์์ ์ ์ ํฉํ ๋ฒ์ฉ JavaScript ์ฝ๋ ์์ฑ์ ๋จ์ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ตฌํ์ HTTP/1.1 undici ํด๋ผ์ด์ธํธ์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณต๋๋ ์ ์ฌํ API์ ์ต๋ํ ๊ฐ๊น์ต๋๋ค. API์๋ fetch() ๋ฉ์๋์ Headers ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. HTTP ํค๋, ์์ฒญ ๋ฐ ์๋ต์ ๋ํ๋ด๋ ์์ฒญ ๋ฐ ์๋ต. const res = fetch('https://nodejs.org/api/documentation.json')๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. if (res.ok) { const data = res.json()์ ๊ธฐ๋ค๋ฆฝ๋๋ค; console.log(๋ฐ์ดํฐ); }
- ๋คํธ์ํฌ๋ฅผ ํตํด ์์ ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ WebStreams API์ ๋ํ ์ง์์ด ์์ ํ๋์์ต๋๋ค. API๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ํ์ผ์ด ๋ค์ด๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ๋ณด๊ฐ ๋์ฐฉํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ฒด ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. Node.js์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด์๋ ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream ๋ฐ DecompressionStream์ด ํฌํจ๋ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋ WebSocket ํด๋ผ์ด์ธํธ์ ์คํ์ ๊ตฌํ์ด ์ถ๊ฐ๋์์ต๋๋ค. WebSocket ์ง์์ ํ์ฑํํ๊ธฐ ์ํด "--experimental-websocket" ํ๋๊ทธ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
- CommonJS(Node.js์๋ง ํด๋น) ๋์ JavaScript ๋ชจ๋ ESM(ECMAScript ๋ชจ๋, ๋ธ๋ผ์ฐ์ ์ฉ ๋ชจ๋์ ์ฌ์ฉ๋จ)์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ฌ์ฉํ๊ธฐ ์ํ ์คํ ๋ชจ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ ํ์์ด package.json์ "type" ํ๋๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ์ ์๋๊ฑฐ๋ "--input-type" ํ๋๊ทธ๋ฅผ ํตํด ์ง์ ๋๊ฑฐ๋ ํ์ผ ํ์ฅ์(ESM์ ๊ฒฝ์ฐ .mjs, .cjs)๋ก ์ธํด ๋ช ํํ ๋ชจ๋์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. CommonJS์ ๊ฒฝ์ฐ). ๊ทธ๋ฌ๋ CommonJS๋ก ๋ช ์์ ์ผ๋ก ์ ์๋์ง ์์ ๋ชจ๋(์: ".js" ํ์ฅ์๋ฅผ ๊ฐ์ง)์ ์ ๋ชจ๋๊ฐ ํ์ฑํ๋๋ฉด ESM ๋ชจ๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋ก์ด ๋ชจ๋ ์ค์ ์ ํ์ฑํํ๊ธฐ ์ํด "--experimental-default-type" ํ๋๊ทธ๊ฐ ์ ์๋์์ต๋๋ค.
- V8 ์์ง์ Chromium 11.8์์ ์ฌ์ฉ๋๋ ๋ฒ์ 118๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค. ์ด ๋ฒ์ ์ ์ด์ ArrayBuffer.prototype.transfer ๋ฉ์๋, ๋ฐฐ์ด ๊ทธ๋ฃนํ ๊ธฐ๋ฅ(groupBy ๋ฉ์๋) ๋ฐ ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ WebAssembly ๋ช ๋ น(i32.add, i32.sub, i32.mul, i64 .add, i64.sub ๋ฐ i64.mul).
- ๋ชจ๋ ๊ตฌ์ฑ์ ์ํ ๋ฑ๋ก ๋ฐ ์ด๊ธฐํ ํธ์ถ์ ์ํด globalPreload ํธ๋ค๋ฌ์ ๋ํ ์ง์์ด ์ค๋จ๋์์ต๋๋ค.
- fs.writeFile ํจ์์ "flush" ์ต์ ์ด ์ถ๊ฐ๋์ด ๊ฐ ์ฐ๊ธฐ ์์ ํ์ ๋ฐ์ดํฐ๊ฐ ๋๋ผ์ด๋ธ์ ๊ฐ์ ๋ก ํ๋ฌ์๋ฉ๋๋ค.
- URL ๊ตฌ๋ฌธ ๋ถ์, API ๊ฐ์ ธ์ค๊ธฐ, ์คํธ๋ฆผ, node:fs ๋ฐ HTTP์ ๊ด๋ จ๋ ์ฝ๋ ์ฑ๋ฅ์ด ํฅ์๋์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ๋ค๋น๊ฒ์ดํฐ ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด CPU ์ฝ์ด ์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ป์ผ๋ ค๋ฉด navigator.hardwareConcurrency ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- "โtest" ๋งค๊ฐ๋ณ์์ ์คํํ ํ ์คํธ๋ฅผ ์ ํํ๊ธฐ ์ํ glob ๋ง์คํฌ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค(์: "โtest **/*.test.js."๋ฅผ ์ง์ ํ ์ ์์).
- ๋ฒ๋ค ํจํค์ง ๊ด๋ฆฌ์ npm 10.2.0 ๋ฐ llhttp 9.1.2 ํ์๊ฐ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
- Visual Studio 2019 ๋ฐ 11.0 ์ด์ macOS ๋ฒ์ ์ ๋ํ ์ง์์ด ์ค๋จ๋์์ต๋๋ค.
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