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

JavaScript๋กœ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์ธ Node.js 19.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Node.js 19๋Š” 2023๋…„ 18์›”๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ œ๊ณต๋˜๋Š” ์ •๊ทœ ์ง€์› ๋ธŒ๋žœ์น˜์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฉฐ์น  ๋‚ด์— Node.js 2025 ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •ํ™”๊ฐ€ ์™„๋ฃŒ๋˜์–ด LTS ์ƒํƒœ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ 16.0๋…„ 2023์›”๊นŒ์ง€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. Node.js 14.0์˜ ์ด์ „ LTS ๋ธŒ๋žœ์น˜ ์œ ์ง€ ๊ด€๋ฆฌ๋Š” 2023๋…„ XNUMX์›”๊นŒ์ง€ ์ง€์†๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰ LTS ๋ธŒ๋žœ์น˜ XNUMX XNUMX๋…„ ์ „์ธ XNUMX๋…„ XNUMX์›”๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

  • V8 ์—”์ง„์ด Chromium 10.7์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„์ „ 107๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Node.js 18 ๋ธŒ๋žœ์น˜์™€ ๋น„๊ตํ•˜์—ฌ ์—”์ง„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ formatRange๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Intl.NumberFormat API์˜ ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „ ๊ตฌํ˜„์ด ์ฃผ๋ชฉ๋ฉ๋‹ˆ๋‹ค. (), formatRangeToParts() ๋ฐ selectRange(), ์„ธํŠธ ๊ทธ๋ฃนํ™”, ๋ฐ˜์˜ฌ๋ฆผ ๋ฐ ์ •๋ฐ€๋„ ์„ค์ •์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์˜ต์…˜, ๋ฌธ์ž์—ด์„ ์‹ญ์ง„์ˆ˜๋กœ ํ•ด์„ํ•˜๋Š” ๊ธฐ๋Šฅ. ํฌํ•จ๋œ ์ข…์†์„ฑ llhttp 8.1.0 ๋ฐ npm 8.19.2๋„ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฐ์‹œ ๋ชจ๋“œ์˜ ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ์‹คํ—˜์ ์ธ "node -watch" ๋ช…๋ น์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด "node -watch index.js"๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” index.js๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค).
  • ๋‚˜๊ฐ€๋Š” ๋ชจ๋“  HTTP/HTTPS ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด HTTP 1.1 ์—ฐ๊ฒฐ ์œ ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ง€์›์ด ํ™œ์„ฑํ™”๋˜์–ด ๋™์ผํ•œ ์—ฐ๊ฒฐ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ์—ฐ๊ฒฐ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค. Keep-Alive๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ ์—ด๊ธฐ ์ œํ•œ ์‹œ๊ฐ„์€ 5์ดˆ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต์—์„œ Keep-Alive HTTP ํ—ค๋” ๊ตฌ๋ฌธ ๋ถ„์„์— ๋Œ€ํ•œ ์ง€์›์ด HTTP ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ Keep-Alive๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„ํ™œ์„ฑ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋™ ์—ฐ๊ฒฐ ํ•ด์ œ๊ฐ€ Node.js HTTP ์„œ๋ฒ„ ๊ตฌํ˜„์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • WebCrypto API๋Š” Ed25519, Ed448, X25519 ๋ฐ X448 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์™ธํ•˜๊ณ  ์•ˆ์ • ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค. WebCrypto ๋ชจ๋“ˆ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ์ด์ œ globalThis.crypto ๋˜๋Š” require('node:crypto').webcrypto๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DTrace, SystemTap ๋ฐ ETW(Windows์šฉ ์ด๋ฒคํŠธ ์ถ”์ ) ์ถ”์  ๋„๊ตฌ์— ๋Œ€ํ•œ ์ง€์›์ด ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ, ์ ์ ˆํ•œ ์ง€์› ๊ณ„ํš ์—†์ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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