노드JS의 특징은 아래와 같이 4가지가 있다.
노드JS는 자바스크립트 엔진으로 동작한다. 그중 v8엔진을 이용하는데 v8엔진은 크롬에서 사용되는 엔진이다.
v8엔진은 c++로 작성이 되어있으며 오픈소스이고 성능이 좋다고 한다.
이런 특징 때문에 노드JS를 이용하면 자바스크립트를 사용할 수 있다.
자바스크립트 언어의 특징이기도 하다. 이전에 정리해두었던 글에 자바스크립트의 싱글스레드 특징을 정리해두었다. 그리고 브라우저 런타임 환경은 nodeJS 런타임 환경과 유사하다.
주의할 점은 만약 비동기적으로 동작하는 작업이 너무 무겁다면 해당 무거운 작업들이 끝날 때까지 다음 비동기 작업을 처리할 수 없기 때문에 비동기 작업은 가볍게 하는게 좋다고 한다.
따라서 이미지처리, 비디오 인코딩과 같은 무거운 계산을 처리하는 작업에는 노드JS가 적합하지 않는다. 하지만 nodeJS 12버전 이상부터 worker threads라는 api를 활용하여 쓰레드를 만들어서 무거운 작업을 처리할 수 있다고하니 해당 키워드로 더 알아보면 좋을것 같다.
Blocking은 동기적(synchronous)인 것을 말한다. 어떤 하나의 요청을 처리할 때 해당 요청이 종료될 때까지 기다린 후 다음 요청을 처리하는 방식이다.
반대로 Non-Blocking은 비동기적(asynchronous)인 것을 말한다. 어떤 하나의 요청의 처리를 기다리지 않는다. 콜백을 넘겨서 다음 작업을 미리 지정하고 다른 작업을 진행 할 수 있다.
입출력 작업을 처리할 때 비공기적으로 동작하는 특징을 말한다. 즉 입출력 처리를 할 때 어떤 요청을 기다리는것이 아닌 요청을 보내고 바로 다음 작업을 처리하는 방식이다.
Event-Driven은 Non-Blocking I/O와 밀접한 관계가 있다.
nodeJS에서는 어떤 작업을 요청했을 때 해당 작업과 관련하여 이벤트를 발생시키고 인지할 수 있다. 예를들어 비동기 작업을 요청하고 처리가 완료되면 알려달라는 이벤트를 발생시키고 해당 이벤트를 감지할 수 있다.
기존 서버의 경우 여러개의 요청이 들어오면 순차적으로 처리를 한다. 그러다가 쓰레드 갯수 이상의 요청이 들어오면 이전에 처리하던 작업이 끝날 때까지 기다려야한다.
하지만 nodeJS서버는 아무리 많은 요청이 들어와도 우선 요청을 다 받아고 DB, 네트워크 쪽으로 넘겨서 처리를 시작한다. 그리고 서버에서 작업이 처리가 완료되면 요청했던 곳으로 반환을 해준다. 즉 하나의 쓰레드가 요청을 받아서 처리하는 것이 아닌 필요한 일들을 처리할 수 있는 데이터베이스나 네트워크에게 위임을 함으로써 여러개의 요청을 빠르게 처리할 수 있다.