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

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

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

  • V8 ์—”์ง„์ด ๋ฒ„์ „ 9.0(Node.js 15์—์„œ๋Š” ๋ฆด๋ฆฌ์Šค 8.6 ์‚ฌ์šฉ)์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ์ •๊ทœ์‹์— ๋Œ€ํ•œ "indices" ์†์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ์น˜ ๊ทธ๋ฃน์˜ ์‹œ์ž‘ ๋ฐ ๋ ์œ„์น˜๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด ํฌํ•จ). , Node.js 16์˜ Atomics ๋ฉ”์„œ๋“œ .waitAsync(Atomics.wait์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „)๋Š” ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ์—์„œ wait ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ์ˆ˜๊ฐ€ ํ•จ์ˆ˜์— ์ •์˜๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ฐ€์†ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Timers Promises API๊ฐ€ ์•ˆ์ •ํ™”๋˜์–ด Promise ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํƒ€์ด๋จธ ์ž‘์—…์„ ์œ„ํ•œ ๋Œ€์ฒด ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ util.promisify()๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 'ํƒ€์ด๋จธ/์•ฝ์†'์—์„œ { setTimeout }์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜ run() { setTimeout(5000)์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. console.log('์•ˆ๋…•ํ•˜์„ธ์š”, ์›”๋“œ!'); } ๋‹ฌ๋ฆฌ๋‹ค();
  • ์•”ํ˜ธํ™” ํ•ด์‹œ ์กฐ์ž‘, ๋””์ง€ํ„ธ ์„œ๋ช… ์ƒ์„ฑ ๋ฐ ํ™•์ธ, ๋‹ค์–‘ํ•œ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉ, ์•”ํ˜ธํ™” ๋ณด์•ˆ ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก๋ฉด์—์„œ ๊ธฐ๋ณธ ์•”ํ˜ธํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋œ Web Crypto API์˜ ์‹คํ—˜์  ๊ตฌํ˜„์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ˆซ์ž. API๋Š” ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • N-API(์• ๋“œ์˜จ ๊ฐœ๋ฐœ์šฉ API)๊ฐ€ ๋ฒ„์ „ 8๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž NPM 7.10์˜ ์ƒˆ ๋ฆด๋ฆฌ์Šค๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • AbortController ์›น API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ์„ ํƒํ•œ Promise ๊ธฐ๋ฐ˜ API์—์„œ ์‹ ํ˜ธ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” AbortController ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ, ์ฒ˜๋ฆฌ ๋˜๋Š” ํŒจํ‚ค์ง€๋œ ๋ชจ๋“ˆ์„ ์›๋ณธ ์†Œ์Šค ์ฝ”๋“œ์™€ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์†Œ์Šค ๋งต ํ˜•์‹์˜ ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ง€์›์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ ์›น API์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด buffer.atob(data) ๋ฐ buffer.btoa(data) ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • M1 ARM ์นฉ์ด ํƒ‘์žฌ๋œ ์ƒˆ๋กœ์šด Apple ์žฅ์น˜์šฉ ์–ด์…ˆ๋ธ”๋ฆฌ ๊ตฌ์„ฑ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Linux ํ”Œ๋žซํผ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „ ์š”๊ตฌ ์‚ฌํ•ญ์ด GCC 8.3์œผ๋กœ ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.

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});"๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ œ์–ด๋Š” ์ถ”๊ฐ€ ์ฝ”๋“œ๋กœ ์ฆ‰์‹œ ์ „๋‹ฌ๋˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Node.js ์ฐฝ์‹œ์ž๊ฐ€ ์ฐจ์„ธ๋Œ€ Deno ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝํ•œ Deno ํšŒ์‚ฌ๊ฐ€ 4.9๋งŒ ๋‹ฌ๋Ÿฌ์˜ ํˆฌ์ž๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. Deno๋Š” ๋ชฉ์ ์ƒ Node.js์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ Node.js ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐœ๋…์  ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‹ค ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Deno์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์†”๋ฃจ์…˜์€ ์™„์ „ํžˆ ๊ฐœ๋ฐฉ๋œ ์ œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋  ๊ฒƒ์ด๋ฉฐ, ๋ณ„๋„์˜ ์œ ๋ฃŒ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Open Core ๋ชจ๋ธ์€ Deno ํ”Œ๋žซํผ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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