Node.js는 Javascript언어를 기반으로 돌아가는 런타임 환경이다.
우리가 흔히 말하는 JavaScript는 두 가지 의미가 있는데, 하나는 Language이며 다른 하나는 Run Time Environment이다.
Node.js는 이 중에서 Javascript의 런타임 환경인 것이다.
그렇다면 등장 배경은 무엇인가?
기존의 Javascript는 Web 기반에서만 돌아갔다. 그래서 Web 상의 보안 문제가 자연스레 따라왔고, 이로 인하여 각종 제약사항이 많이 따랐다고 한다. 그래서 등장한 것이 Node.js이다. Javascript를 Web상에서가 아닌, 외부에서 Node.js 에서 돌아갈 수 있도록 해주는 런타임 환경이 등장한 것이다.
이러한 Node.js의 특징을 살펴보자.
첫 째, Node.js는 구글의 Javascript 엔진인 V8 Engine을 사용한다.
둘 째, Event-Driven 방식으로 작동하기 때문에 자원 사용에 효율적이다.
Web은 이벤트가 발생할 때 까지 항상 대기 상태를 유지하고 있다. 이에 반해 Node.js는 이벤트 발생 시에만 작동된다. 그렇기 때문에 자원을 효율적으로 사용할 수 있다.
셋 째, Non-Blocking I/O, 즉 비동기식이다.
Blocking I/O란, Read/Write의 이벤트 발생 시, 이벤트가 끝날 때 까지 해당 모듈을 점유하는 입출력 방식이다. 이에 반해 Non-Blocking I/O는 Read/Write발생 시, 모듈을 변환하여 다른 작업을 가능하게 한다.
(Oracle 참조, Request가 큐에 꽉 찼을 때, Blocking은 추가적으로 데이터가 들어오는 것을 막지만, Non-Blocking은 이를 막지 않고 버퍼에 저장한다.)
따라서, 동기식에 비하여 속도도 빠르고 메모리 점유율도 낮다.
넷 째, Single Thread로, 장점이 될 수도 있고 단점이 될 수도 있다.
Single Thread 특징은 Javascript언어가 Single Thread이기 때문에 따르는 것이다. 싱글 스레드의 장점으로는 적은 양의 자원으로 일 처리가 가능하다는 것이다. 그러나 한 곳에 문제 발생 시 어플리케이션 전체에 영향을 미칠 수 있다는 단점이 있다.
이러한 단점을 감안하여 Web Server로서 Node.js 대신 Tomcat을 사용할 수 있다.
(생각해보니 Node.js는 서버의 기능도 하지만, 애초에 런타임 환경이기 때문에 Tomcat과 비교하기 좀 그런 듯)
다섯 째, 클라이언트와 서버 상 언어가 Javascript로 같다.
------------------------------------------------------------------------------------------------------------------------------------
면접 질문중에 내가 진행한 프로젝트 중 WAS로 Tomcat을 사용하였다고 하니까 왜 Node.js를 쓰지 않았냐고 반박이 들어왔다.
당시는 잘 몰라서 어영부영했지만, 사용 용도나 사용 언어(Java) 그리고 기업에서 Node.js 보다는 Java 런타임 환경을 많이 쓴다고 답하면 되지 않았을까 싶다.