Server JavaScript Runtime 기술 동향

브라우저 외부에서 JavaScript를 사용할 수 있는 Node.js가 등장한 이후 산업전반에서 다양하게 활용되며 De-facto 표준으로 자리잡았다. 현재는 Node.js의 결점을 보완하거나, 각 회사에 최적화 된 자체 솔루션으로 대체하는 방향으로 JavaScript 런타임이 파편화되고 있으며, 개발자들에게 통합된 개발 API을 제공하기 위한 각 런타임 간 상호운용성에 대해 논의 중이다.

신규 Server/Edge JavaScript Runtime의 주요 기능

신규 Runtime들은 각각 차별되는 다양한 기능을 가지고 있으며 Node.js 대비 크게 보안, 성능, 모듈 복잡성 개선, 향상된 DX 제공 등을 주요 목표로 하고 있다. Deno는 보안 측면에서 Node.js가 시스템 자원의 사용에 대해 어떠한 제한도 두고 있지 않는 것에 비해, 사용자가 사용하는 외부 모듈에 대해서 투명하게 공지하고 제한하는 기능을 제공한다.

Bun은 Network/DB 테이블 로딩등의 성능에 있어서 유의미한 차이를 제공하며, Workerd는 여러 앱을 하나의 Runtime에서 실행하여 메모리 사용량 및 Cold Start 속도를 향상시킨다. Core API에 여러 기능이 포함되는 것을 지양한 Node.js에 비해, 신규 Runtime에서는 모던 JavaScript 앱 개발시 빈번하게 사용되는 필요한 기능 (예: Transpiler, Package manager, Bundler, Test Runner 기능등)을 Core 기능으로 포함시켜 DX를 향상시키고 있다.

공통적인 특징은 각 Runtime의 Core API의 디자인을 Web Platform API을 기반으로 하였다고, 새로운 기능을 제공하면서 많은 Eco를 확보하고 있는 Node.js Core API의 호환성을 보완한다는 점이다. 그리고, Node.js 또한 이러한 신규 Runtime의 영향으로 보안, 성능, DX 향상등에 점진적으로 보완해가는 중이다.

Denoland - Deno (https://deno.com/)

  • V8 엔진 기반, Rust로 Core 작성, TypeScript 지원, Web Platform API 호환성 제공
  • FileSystem, Network, Script Execution 등에 대한 Permissions Model 제공
  • NPM과 같은 중앙집중형 모듈 저장소를 사용하지 않음

Oven - Bun (https://bun.sh/)

  • JavaScriptCore 엔진, Zig 언어로 Core 작성, TypeScript 지원, Web Platform API 호환성 제공
  • Cold Start 시간, Network/DB Request 처리 시간 등 성능에 최적화
  • FFI(foreign function interface) 기능, 내장 SQLite3 지원
  • All-in-one DX 제공 (Package Manager, Bundler, Test Runner등이 Runtime에 포함됨)

Cloudflare - Workerd (https://github.com/cloudflare/workerd)

  • V8 엔진 기반, Webassembly, Web Platform API 호환성 제공 제공
  • V8 Isolation 기능을 이용한 샌드박싱 환경을 제공이 특징 - 하나의 Runtime에서 여러개의 App을 수행할 수있는 독립적 공간을 제공
  • VM 또는 Container 대비 사용 Cold Start 시간, CPU 사용시간 및 사용 메모리 절감

그 밖의 Server/Edge JavaScript Runtime

  • Alibaba Cloud - EdgeRoutine
  • Vercel - Edge Runtime
  • Fastly - Compute@Edge
  • Lagon - Lagon Runtime

JavaScript Runtime 간 상호 운용성

Node.js로 시작된 Server/Edge 향 Runtime이 다양한 형태로 파편화 되면서 개발자는 Unified App을 개발이 어려워졌다. 이로 인해 여러 Runtime 구분없이 공통으로 사용할 수 있는 API 제공에 대한 필요성이 제기되었다. 이식성 높은 코드를 작성에 대한 각 서버쪽 JS Runtime의 사용자 피드백에 따르면 공통 API에 디자인에 대해 Web-first 접근법이 매우 중요하다는 결과가 있었다. Web 플랫폼이란 가장 크고 중요한 API와 지식에 바탕을 두면 특정 플랫폼이나 Runtime별 새로운 API나 기능을 배우지 않고 보다 보편적으로 통용되는 API를 사용할 수 있다고 판단되었기 때문이다.

한편, Web Platform API가 브라우저의 특정 요구사항만을 고려해 설계되어있어 브라우저가 아닌 환경에 쉽게 최적화가 어렵거나 동작이 미세하게 다른 점이 있었다. 이러한 차이들이 발견됨에 따라 일관성있는 API 를 동작을 구현하기 어렵게 되었다. 이러한 문제를 해결하기 위해, Node.js, Deno, Cloudflare, Vercel, Shopify등에서 활동하는 엔지니어 주축으로 2022년 Web-interoperable Runtimes Community Group (WinterCG) 가 조직되었다. 브라우저를 포함한 JavaScript Runtime의 구현이 어떻게 다르며 상호 운영성을 높이기 위한 부분을 토론하고 WHATWG, W3C에 필요한 부분을 제안하고 있다.

현재 JavaScript 런타임 환경에서 지원을 권장하는 최소 API 집합이 제안되어 있다. WinterCG에 순응한 JavaScript를 만들시, 이러한 Web Platform API 기반으로 App을 구성하면 브라우저, Server, Edge환경의 구별없이 JavaScript 런타임 간 Portability를 보장받게 된다.

Insight

Node.js의 성숙도와 생태계 규모는 여전히 큰 장점이다. 그러나, Node.js가 JavaScript를 브라우저 외부로 가져온 것과 같이, 모던 웹 기술을 Server 또는 Edge 기기 향 JavaScript 런타임에 이식해 생태계를 구축하려는 동향이 있다. 이러한 흐름을 반영해 개발자를 지원하고 기기에 최적화된 JavaScript 런타임 제공을 고려해볼 수 있을 것이다.

Share