Web

[Web] Node.js란?

luk_hwkim 2022. 6. 1. 19:56

개요

'Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임',
웹 서버와 같이 확장성 있는 네트워크 프로그램 제작을 위해 고안 되었다.

즉, Node를 통해 다양한 JS 애플리케이션을 실행할 수 있고, 서버를 실행하는데 제일 많이 사용된다.

 

특징

이벤트 기반

Node는 V8과 더불어 libuv라는 라이브러리를 사용한다. libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있다. 

이벤트 기반(event-driven)이란, 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

즉, 특정 이벤트가 발생할 때 무엇을 할 지 미리 등록해두고, 이를 이벤트 리스너에 콜백 함수를 등록한다.  이후 이벤트가 발생하면 리스너에 등록해둔 콜백 함수를 호출하며 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.

 

이벤트 루프

이벤트 루프는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.

노드는 이벤트가 종료될 때 까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다.

논 블로킹 I/O

작업에는 두 가지 종류가 있는데, 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이다. 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 I/O의 일종이며, 이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리를 한다. 

논 블로킹이랑 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미하고, 블로킹은 이전 작업이 끝나야만 다음 작업을 수행한다.

싱글스레드

이벤트 기반, 논 블로킹 모델과 더불어 노드를 설명하는 키워드 중 하나는 싱글 스레드(Single thread)이다. 

자바스크립트 코드는 동시에 실행 될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문이다. 

Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만, 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완룓욀 때까지 대기하지 않고 다음 작업을 수행한다.

JavaScript의 독립적인 동작

JavaScript는 C/C++이나 Java같은 프로그래밍 언어와는 다르게 스크립트 언어이기 때문에, 웹 브라우저(크롬, 익스플로러, 사파리...)가 없으면 사용할 수 없다.

하지만 Node.js를 통해 JavaScript를 웹브라우저로부터 독립시켜 브라우저 없이 실행하도록 할 수 있다.

이렇게 Node.js를 통해 웹브라우저와 무관한 프로그램을 만들 수 있기 때문에 서버를 만들 수도 있게 되는 것이다. 

 

결론

노드는 기본적으로 싱글 스레드, 논블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋다. 하지만 CPU부하가 큰 작업에는 적합하지 않다.

즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 노드는 적합하다. 

결론적으로 노드의 장점은

첫 째, 멀티 스레드 방식에 비해 적은 자원을 사용한다.

둘 째, I/O작업이 많은 서버로 적합하다.

셋 째, 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없다.

넷 째, 자바스크립트를 사용하기 때문에 JSON형식과 쉽게 호환된다.