Node.Js란?

2023. 2. 1. 01:34JS

노드 js
노트북 스티커를 노린 로고 디자인

Node.Js란

자바스크립트 실행기(서버 프레임워크가 아닙니다)

 

브라우저에서 HTML 코드를 조작하기 위해 사용되던 기존의 Javascript를 독립적으로 사용하기 위한 자바스크립트 런타임 환경

npm이라는 패키지 매니저를 통해 다양한 모듈을 사용할 수 있어 어플리케이션의 확장성이 높으며, 구글의 자바스크립트 엔진인 V8libuv를 통해 빠른 처리 속도를 지닙니다.

Non-Blocking I/O와 싱글 스레드 기반의 이벤트 루프로 동작한다는 점이 특징입니다.

자바스크립트 코어 라이브러리는 Node를 통해 C, C++ 구현체인 V8, Libuv와 연결됩니다.

 

V8 엔진

V8
오픈소스 자바 스크립트 엔진, V8

이름부터 8기통인 만큼 빠른 속도를 위해 만들어졌습니다.

 구글에서 개발한 자바스크립트 엔진으로, 크롬에 탑재되어 있는 자바 스크립트 엔진으로 이그니션과 터보팬이라는 두 가지 핵심 컴포넌트를 통해 성능을 끌어올립니다.

 가볍게 설명하자면 Ignition은 매 라인을 런타임에 바이트 코드로 컴파일해 파싱과 최적화에 드는 시간을 줄입니다. 이렇게 매 줄 바이트 코드를 실행하며 터보팬에서는 히든 클래스와 캐싱을 통해 객체를 효율적으로 관리하고 반복되는 코드를 최적화해 실행 속도를 향상시킵니다.

 

Libuv

libuv는 이벤트 루프와 Non-Blocking I/O, 스레드 풀, 파일 시스템, 시스템 작업 등 OS의 자원을 이용하기 위해 사용되는 라이브러리

 운영체제의 Low-Level을 추상화시켜 Async, NonBlock I/O, 이벤트 루프 등 노드의 특징을 유지하면서 크로스 플랫폼을 구현할 수 있습니다.

 

Node.JS 성능

 싱글 스레드로 동작하는 Node.js가 고성능이라는 주장은 이해하기 어려울 수 있는데, 멀티 프로세스, 멀티 스레드를 통해 병렬적으로 여러 컨텍스트를 실행하는 이유가 고성능의 연산 작업을 위함이기 때문에 모순이라고 생각할 수 있습니다.

 

 실제로 단일 작업이 복잡한 연산을 처리하는 상황이 많다면 다른 방법들에 비해 성능이 떨어질 수 있습니다. 다만 실제 대부분의 서버는 네트워킹, I/O 작업에서 대부분의 시간을 사용하게 됩니다.

 

 Node.js가 성능을 향상시키는 방법은 단일 스레드 이벤트 루프 방식, 즉 시분할 스케줄링으로 컨텍스트 스위칭에 드는 비용을 줄이고 I/O와 네트워킹은 OS에게, 비동기 작업이나, DB 같은 특정 I/O 작업은 libuv의 스레드 풀의 워커 노드들에게 넘기고 하나의 스택에서 가벼운 연산들을 빠르게 처리하여 성능을 향상시킵니다. 이러한 방식은 하나의 커넥션마다 하나의 프로세스, 스레드를 생성하는 멀티 프로세싱, 멀티 스레딩 방식보다 효율적일 수 있습니다.

 

 이를 이벤트 멀티플렉싱이라고 하는데, libuv의 이벤트 루프는 폴링을 통해 이벤트를 감지하고, 메인 스레드의 콜 스택이 비어있을 경우 이벤트를 실행합니다. 실제 백엔드 서버에서 사용되는 연산은 보통 복잡하고 오래 걸리지 않으므로, 이러한 특정 상황에 한정해 Node.js가 더 빠를 수 있습니다.

 특히 비 선점형 스케쥴링 (Non Preemptive Scheduling) 방식을 사용하는 Node.js의 이벤트 루프는 단일 Request가 스레드를 독점하고 많은 연산을 사용한다면 전체적인 성능이 떨어질 수 있으며, 에러가 생길 경우 프로세스가 쉽게 종료될 수 있다는 단점도 존재합니다. 

 

결론

 서로 다른 여러 클라이언트의 요청에 응답하는 작업처럼 비동기적으로 처리할 수 있는 여러 작업을 처리하기 위한 용도의 서버라면 Node.js가 적합하나, 한계도 분명히 있기 때문에 목적과 대안 등을 비교해 보면 좋을 것 같습니다.

반응형

'JS' 카테고리의 다른 글

Nest.Js) 중급자를 위한 Gateway/Socket.io 설명회  (5) 2023.02.08