본문 바로가기
Programming/Node.js

[NodeJS] 공식문서 개념정리

by 깐니 2020. 4. 25.

 

Node.js 교과서를 보며 공부한 자료입니다.

## 노드 공식문서에서의 노드의 설명은 다음과 같다.  (https://nodejs.dev/)

Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다.

Node.js는 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다.

Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.

 

 

이 글을 읽고 V8? 런타임? 이벤트 기반? 논블로킹? 나는 물음표 살인마가 되었다 ,,

그래서 한 문장씩 이해한 것을 포스팅해보고자 한다.

 

 


" Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다. " 

아래와 같이 해석할 수 있다. 

 

Node.js는 브라우저 외부에서 Chrome의 핵심인 V8 JavaScript 엔진을 실행함으로써 성능이 향상되고,

JavaScript 프로그램을 컴퓨터에서 실행할 수 있는 환경을 제공한다.

 

 

그렇다면 전체적인 노드의 구조는 어떻게 생겼을까?

Node.js Core Library
(console, 파일핸들링 ..)
Node.js Bindings
(socket, http..)
V8
(오픈소스 자바스크립트 엔진)
libuv
(이벤트 기반, 논블로킹 I/O의 모델)

 

 

여기서, V8엔진과 libuv라이브러리에 대해 살펴보자.

기존의 노드는 자바스크립트의 실행 속도 문제가 있었다.

하지만 구글이 매우 빠르고, 오픈 소스로 코드도 공개된 자바스크립트 엔진인 V8엔진을 사용해서 크롬을 출시하게 되었고,

속도 문제를 해결한 V8엔진 기반의 노드 프로젝트가 시작되었다.

또한, 노드는 libuv 라이브러리를 사용한다.

libuv 라이브러리는 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있는데, 이것은 노드의 특성이라고도 이야기할 수 있다.

노드의 특성에 대해서는 밑에서 더 살펴보자.

V8엔진과 libuv 라이브러리는 C, C++로 구현되어 있지만, 노드가 알아서 개발자가 작성한 자바스크립트 코드와 연결해준다.

 

 

 


"Node.js는 이벤트 기반, 논블로킹 I/O모델을 사용해 가볍고 효율적이다."

이 문장에서는 이벤트 기반, 논블로킹 I/O모델, 그리고 싱글 스레드라는 개념까지 알아보자.

 

 

 

(1) 이벤트 기반 시스템 (Event-driven System)

 

이벤트 기반 시스템은 이벤트 리스너에 콜백 함수를 등록해서, 특정 이벤트가 발생했을 때, 무엇을 할지 미리 등록한다.

만약, 이벤트가 발생하면 노드는 이벤트 리스너에 등록해둔 콜백 함수를 호출한다.

발생한 이벤트가 없거나 끝나면 노드는 다음 이벤트가 발생할 때까지 대기한다.

 

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

그렇다면 이벤트 루프가 동작하는 방식에 대해 알아보고 다음으로 넘어가자.

 

우선, 이벤트 루프의 동작방식을 알아보기에 앞서, 몇 가지 용어들을 숙지해야 한다.

  • 이벤트 루프  노드가 종료될 때까지, 이벤트 발생 시에 호출할 콜백함수를 관리하고, 실행 순서를 결정하는 작업을 반복한다.
  • 태스크 큐 (=콜백 큐)  이벤트 발생 후, 호출되어야 할 콜백함수들이 이벤트 루프가 정한 순서대로 기다리는 공간이다.
  • 백그라운드  타이머, I/O작업콜백, 이벤트 리스너가 기다리는 공간이다.

다음은 예시 코드와 실행 결과이다.

function run(){
	console.log('3초 후 실행..');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
시작
끝
3초 후 실행

 

 

다음은 예시 코드에 대한 이벤트 루프 내부이다.

이벤트 루프의 동작 방식을 적어보자.

  1. 처음 실행 시에 생성되는 환경인 main()함수가 호출 스택에 들어가고, 이벤트리스너인 setTimeout()함수도 호출 스택에 들어간다.
  2. setTimeout()함수가 실행되면서, 타이머3초와 콜백함수 run()이 백그라운드에서 대기하게 되고, setTimeout()함수는 호출 스택에서 빠진다.
  3. main()함수도 호출 스택에서 빠진다.
  4. 백그라운드에서 타이머3초가 종료되면, 콜백함수 run()을 태스크 큐에 보낸다.
  5. 이벤트 루프는 호출 스택이 비어있으면, 태스크 큐에서 함수를 정해진 규칙대로 호출 스택에 넣고 실행한다.
  6. 이벤트 루프는 태스크 큐에 콜백함수가 들어올 때까지 계속 대기한다.

 

 

 

(2) 논블로킹 I/O 모델 (non-blocking) 과 싱글 스레드 (Single-Thread)

 

논블로킹 방식이란, 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행하는 방식이다.

블로킹 방식에 비해 같은 작업을 더 짧은 시간동안 처리할 수 있다.

 

노드는 싱글스레드이다.

주어진 작업을 하나의 스레드가 처리해야 한다.

따라서 노드에서는 논블로킹 방식이 중요하다.

 

  • I/O 작업은 노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있기 때문에,  노드는 논블로킹 방식으로 I/O작업을 처리해서 블로킹 방식에 비해 시간적 이득을 볼 수 있다.

    즉, 노드는 I/O 작업이 있을 경우에 비동기 방식으로 I/O요청을 던져놓고, 다시 돌아와서 작업하다가 I/O작업이 끝나면 이벤트를 받아서 처리하는 방식이다.
  • 노드는 싱글스레드를 이용하기 때문에, 스레드를 늘리는 대신, 프로세스 자체를 복사해서 여러 작업을 동시에 처리하는 멀티프로세싱 (multi-processing)방식을 이용한다.
  • 노드는 코드를 논블로킹방식으로 만들기 위한 여러기법을 이용한다. 
    이것에 대해서는 자세히 다음 포스팅에서 정리하고 지금은 타이머, process.nextTick, ,정도로만 알아두자.

 

 


 

 

 

## 노드를 이용한 서버

노드와 마찬가지로, 싱글 스레드, 논블로킹 모델을 사용하는 노드서버에 대한 장단점에 대해 알아보자.

 


장점

- 싱글 스레드이므로 컴퓨터 자원을 상대적으로 적게 사용한다.

- 노드는 libuv 라이브러리를 사용하여 I/O작업을 논블로킹 방식으로 처리하므로 시간적이득을 볼 수 있다.

- 웹 서버가 내장되어있다.

   하지만 서버 규모가 커지면 nginx 등의 웹서버를 노드서버와 연결해야한다.

- 언어로 자바스크립트를 사용하여, 웹 브라우저와 서버 모두 하나의 언어로 웹 사이트 개발이 가능하다.

 

 

단점

- 싱글 스레드이므로 이미지,비디오처리, 대규모데이터 처리와 같은 CPU 부하가 큰 작업에 적합하지 않다.

 

 


서버로 노드를 이용하기 적합한 경우를 알아보자.

 

서버로 노드를 이용하기에 적합한 경우는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합하다.
예를 들어 다음의 경우와 같다.

- I/O 가 많은 작업
- 실시간 채팅 애플리케이션이나 주식 차트 등
- JSON 데이터를 제공하는 API서버

 

 

'Programming > Node.js' 카테고리의 다른 글

[NodeJS] Passport 기반 인증 처리  (0) 2020.10.11