์„œ๋ฒ„ ์ธก JavaScript Node.js 17.0 ๋ฆด๋ฆฌ์Šค

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

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

  • V8 ์—”์ง„์ด ๋ฒ„์ „ 9.5๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Promise ๋น„๋™๊ธฐ ์ปดํ“จํŒ… ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ธฐ๋ณธ API์˜ ๋ณ€ํ˜• ๊ตฌํ˜„์ด ๊ณ„์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ œ์•ˆ๋œ Timers Promises ๋ฐ Streams Promises API ์™ธ์—๋„ Node.js 17.0์—๋Š” readline ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ๋Š” Readline Promise API๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. import * as readline from 'node:readline/promises'; import { stdin์„ ์ž…๋ ฅ์œผ๋กœ, stdout์„ ์ถœ๋ ฅ์œผ๋กœ } from 'process'; const rl = readline.createInterface({ ์ž…๋ ฅ, ์ถœ๋ ฅ }); const answer = await rl.question('Node.js์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?'); console.log('๊ท€์ค‘ํ•œ ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค: ${answer}'); rl.close();
  • ์ œ๊ณต๋œ OpenSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฒ„์ „ 3.0์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(QUIC ํ”„๋กœํ† ์ฝœ ์ง€์›์ด ํ™œ์„ฑํ™”๋œ quictls/openssl ํฌํฌ ์‚ฌ์šฉ).
  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด Node.js ๋ฒ„์ „์ด ์Šคํƒ ์ถ”์ ์— ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ Node.js์˜ ํ˜„์žฌ ๋ธŒ๋žœ์น˜(CVE-2021-22959, CVE-2021-22960)์—์„œ ๋‘ ๊ฐ€์ง€ ์ทจ์•ฝ์ ์ด ์ œ๊ฑฐ๋˜์–ด HRS(HTTP ์š”์ฒญ ์Šค๋จธ๊ธ€๋ง) ํด๋ž˜์Šค์˜ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ „์†กํ•˜์—ฌ ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์˜ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋‚ด์šฉ์— ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์—์„œ ์•…์„ฑ JavaScript ์ฝ”๋“œ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ). ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ ๊ณต๊ฐœ๋˜๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” HTTP ํ—ค๋” ์ด๋ฆ„๊ณผ ์ฝœ๋ก  ์‚ฌ์ด์˜ ๊ณต๋ฐฑ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜๋ชป๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ์ „๋‹ฌ ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ธ”๋ก์˜ ์บ๋ฆฌ์ง€ ๋ฆฌํ„ด ๋ฐ ์ค„ ๋ฐ”๊ฟˆ ๋ฌธ์ž ์ฒ˜๋ฆฌ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. "chunked" ๋ชจ๋“œ์—์„œ ์ฒญํฌ์˜ ์š”์ฒญ ๋ณธ๋ฌธ. ".

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

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