자바스크립트 엔진은 웹 브라우저, 웹 서버에서도 실행되며, 이를 가능하게 만드는 것이 자바스크립트 런타임 환경
자바스크립트 엔진은 언어의 문법만을 처리하며, 다양한 API와 라이브러리 덕분에 다양한 기능을 제공
자바스크립트 엔진 기반의 자바스크립트 런타임의 종류는 점차 많아지고 있다.
웹 서버를 위한 Deno.js (Node.js 창시자가 만든 새 자바스크립트 런타임, 에너그램, V8엔진을 사용한다.)
웹 서버를 위한 Bun.js (크롬 V8 엔진이 아닌 사파리 JSC 엔진 기반)
![]()
- JRE(Java Runtime Environment) = JVM(Java Engine) + 라이브러리(Collection 등 유틸)
V8 자바스크립트 엔진은 웹 브라우저 크롬에서도 사용되고, 웹 서버 Node.js 에서도 사용되는 유명한 엔진
자바스크립트 엔진만으로는 브라우저나 서버의 기능을 사용할 수 없기 때문에, 이를 가능하게 만드는 API들이 존재합니다.
자바스크립트에서 제공되는 문법을 제공한 모든것들은 런타임 환경 내 API 가 제공하는것이라 생각하면된다
Web APIs = 웹 브라우저에서 제공되는 다양한 API 들
Node APIs = 웹 서버에서 제공되는 다양한 API 들 (단일 웹 서버이기에 API 모두 지원)
브라우저는 DOM 조작과 UI 관련 작업에 최적화된 API 제공(Web APIs), Node.js는 파일 시스템 접근 및 네트워크 처리에 최적화.
![]()
- 다양한 웹 브라우저가 존재하기에 Web APIs 는 몇몇의 웹 브라우저에서는 어떤 API 는 제공되지 않는다.
- 이로인해 각각의 브라우저마다 호환성 체크를 해야한다.
자바스크립트는 다양한 환경에서 실행될 수 있으며, 각 환경에 맞는 런타임이 존재합니다.
![]()
자바스크립트 엔진 + Web APIs
순서
- JS 엔진 → 메인(떡썰기) / 웹 API → 멀티쓰레드(글쓰기)
- JS엔진이 큐에서 콜백함수를 호출함(부르기 전까지 큐에서 대기)
- 이때 호출을 도와주는것이 이벤트 루프
- 하지만 스택(콜스택)에서 일처리가 많으면 우선순위가 스택에 있는것이 먼저 처리가 된다.
프론트엔드 개발자가 직접 자바스크립트로 멀티스레드를 활용하여 웹 브라우저 기능을 개발하고 싶을 시
Web APIs 종류
Web Worker API 브라우저에서 멀티스레드를 사용할수 있게 해주는 API
Web Worker는 별도의 스레드에서 실행되는 JavaScript 코드로, 주 스레드(메인 스레드)와는 독립적으로 동작합니다. 하지만 두 스레드 간의 데이터 전달이 필요할 때, postMessage와 onmessage를 사용하여 메시지를 주고받을 수 있습니다.
postMessage와 onmessage
postMessage: 한 스레드에서 다른 스레드로 메시지를 보낼 때 사용하는 메서드입니다.
onmessage: 메시지를 받을 준비가 되어있는 스레드에서 해당 메시지를 처리하는 이벤트 리스너입니다.
Dedicated Web Worker : 특정 웹 페이지만 적용되는 워커
Shared Web Worker : 여러 웹 페이지에서 공유 가능한 워커
Service Worker API : 오프라인 지원, 푸시 알림, 백그라운드 동기화 등 특수 기능을 수행하는 워커, 웹 브라우저(웹앱)와 인터넷 사이의 Middleware 혹은 Proxy 동작
연결이 해제가 되어도 웹페이지가 돌아간다. 이유는 캐싱이 되어있기 때문이다.
(심화) 동작 : postMessage
, onmessage
와 같이 Pub/Sub Pattern 으로 구현
Pub/Sub Pattern (퍼블리셔/서브스크라이버 패턴)
Pub/Sub Pattern은 메시지를 주고받는 디자인 패턴입니다. 퍼블리셔(발행자)가 메시지를 보내면, 이를 구독하고 있는 서브스크라이버(구독자)가 메시지를 받는 구조입니다.
postMessage는 퍼블리셔 역할을 하고, onmessage는 서브스크라이버 역할을 하여 메시지를 받는 구조로 동작합니다.
onmessage
+ postMessage
)MessageChannel은 두 개의 메시지 포트를 제공
이 포트를 통해 두 스레드 간에 데이터를 비동기적으로 주고받을 수 있다.
이 방식은 postMessage와 onmessage를 사용한 기본적인 메시지 전달 방법을 보강하는 더 고급 기능입니다.
CPU 코어 수만큼 Web Worker 생성하기
멀티스레드를 활용할 때, 스레드의 수는 CPU의 코어 수에 맞추는 것이 좋다.
Web Worker의 수를 CPU 코어에 맞추는 이유는 각 스레드가 물리적 또는 논리적 코어에서 실행되기 때문.
그러나, 브라우저나 Node.js에서 코어 초과 워커를 생성해도 스케줄링에 의해 적절히 관리되므로 성능 저하가 반드시 발생하지는 않음.
자바스크립트 엔진 + Node APIs + LIBUV