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

JavaScript๋กœ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์ธ Node.js 18.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Node.js 18.0์€ ์žฅ๊ธฐ ์ง€์› ๋ธŒ๋žœ์น˜๋กœ ๋ถ„๋ฅ˜๋˜๋Š”๋ฐ, ์ด ์ƒํƒœ๋Š” ์•ˆ์ •ํ™” ์ดํ›„์ธ 18์›”์—๋งŒ ๋ถ€์—ฌ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. Node.js 2025.x๋Š” 16๋…„ 2024์›”๊นŒ์ง€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. Node.js 14.x์˜ ์ด์ „ LTS ๋ธŒ๋žœ์น˜ ์œ ์ง€ ๊ด€๋ฆฌ๋Š” 2023๋…„ 12์›”๊นŒ์ง€ ์ง€์†๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰ LTS ๋ธŒ๋žœ์น˜ 30.x 17๋…„ ์ „์ธ 1๋…„ XNUMX์›”๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. XNUMX.x LTS ๋ธŒ๋žœ์น˜๋Š” XNUMX์›” XNUMX์ผ์— ์ค‘๋‹จ๋˜๊ณ , Node.js XNUMX.x ์Šคํ…Œ์ด์ง• ๋ธŒ๋žœ์น˜๋Š” XNUMX์›” XNUMX์ผ์— ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ:

  • V8 ์—”์ง„์ด Chromium 10.1์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„์ „ 101๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Node.js 17.9.0 ๋ฆด๋ฆฌ์Šค์™€ ๋น„๊ตํ•˜์—ฌ ์ด์ œ ๋์„ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” findLast ๋ฐ findLastIndex ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๋ฐ Intl.supportedValuesOf ํ•จ์ˆ˜. ํ–ฅ์ƒ๋œ Intl.Locale API. ํด๋ž˜์Šค ํ•„๋“œ ๋ฐ ๊ฐœ์ธ ๋ฉ”์†Œ๋“œ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€์†ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ—˜์ ์ธ fetch() API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ HTTP/1.1 undici ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณต๋˜๋Š” ์œ ์‚ฌํ•œ API์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ—ค๋”๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ FormData, ํ—ค๋”, ์š”์ฒญ ๋ฐ ์‘๋‹ต ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ง€์›์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. const res = fetch('https://nodejs.org/api/documentation.json')๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. if (res.ok) { const data = res.json()์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค; console.log(๋ฐ์ดํ„ฐ); }
  • ์›น ์ŠคํŠธ๋ฆผ API์˜ ์‹คํ—˜์  ๊ตฌํ˜„์ด ์ถ”๊ฐ€๋˜์–ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ •๋ณด๊ฐ€ ๋„์ฐฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ž์ฒด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Node.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์—๋Š” ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream ๋ฐ DecompressionStream์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • Blob API๊ฐ€ stable๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • BroadcastChannel API๊ฐ€ ์•ˆ์ •ํ™”๋˜์–ด "ํ•œ ๋ช…์˜ ๋ฐœ์‹ ์ž - ๋‹ค์ˆ˜์˜ ์ˆ˜์‹ ์ž" ํ˜•์‹์œผ๋กœ ๋น„๋™๊ธฐ ๋ชจ๋“œ์—์„œ ๋ฉ”์‹œ์ง€ ๊ตํ™˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TAP(Test Anything Protocol) ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” JavaScript์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ—˜์  ๋ชจ๋“ˆ node:test๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Red Hat Enterprise Linux(RHEL) 8 ๋ฐ Debian 2.28 ๋ฐ Ubuntu 10๋ฅผ ํฌํ•จํ•œ Glibc 20.04+ ๊ธฐ๋ฐ˜์˜ ๊ธฐํƒ€ ๋ฐฐํฌํŒ๊ณผ macOS 10.15+์šฉ์œผ๋กœ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ƒ์„ฑ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. V8 ์—”์ง„ ๋นŒ๋“œ ๋ฌธ์ œ๋กœ ์ธํ•ด Windows์šฉ 32๋น„ํŠธ ๋นŒ๋“œ ์ƒ์„ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด Node.js ์‹คํ–‰ ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ์‹คํ—˜์  ์˜ต์…˜์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด "--node-snapshot-main" ์˜ต์…˜์ด ๊ตฌ์„ฑ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "./configure โ€”node-snapshot-main=marked.js;). ์ด๋ฆ„ ๋…ธ๋“œ"

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

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