2023. 2. 1. 01:34ㆍJS
Node.Js란
자바스크립트 실행기(서버 프레임워크가 아닙니다)
브라우저에서 HTML 코드를 조작하기 위해 사용되던 기존의 Javascript를 독립적으로 사용하기 위한 자바스크립트 런타임 환경
npm이라는 패키지 매니저를 통해 다양한 모듈을 사용할 수 있어 어플리케이션의 확장성이 높으며, 구글의 자바스크립트 엔진인 V8과 libuv를 통해 빠른 처리 속도를 지닙니다.
Non-Blocking I/O와 싱글 스레드 기반의 이벤트 루프로 동작한다는 점이 특징입니다.
자바스크립트 코어 라이브러리는 Node를 통해 C, C++ 구현체인 V8, Libuv와 연결됩니다.
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 |
---|