์„œ๋ฒ„ ์ธก JavaScript ํ”Œ๋žซํผ Node.js 20.0 ์‚ฌ์šฉ ๊ฐ€๋Šฅ

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€