IT 정보 로그캣/Javascript

[Node.js] Node.js 란?

지푸라기 개발자 2019. 1. 24. 15:32
반응형

웹 애플리케이션 서버 (WAS, Web Application Server) 를 만들기 위해 Node js 를 선택했다.

선택한 이유로는 개발 생산성 측면과 구조적 측면 (싱글스레드 기반의 비동기 처리 방식) 때문이다.

보통 비슷한 이유로 스타트업 등에서 Node js를 많이 선택한다.

Node js 를 사용하기 전에 어떤 기술인지 부터 알고 사용하자!

 

 

 

Node.js 란?


Node js 는 2009년 Ryan Dahl에 의해 시작된 오픈 소스 노드 프로젝트이다. 

Node.js 공식 홈페이지에 따르면 Node.js 는 Chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임으로 정의되고 있다.

여기서 Chrome V8 자바스크립트 엔진은 웹 브라우저를 만들기 위한 구글의 오픈 소스 자바스크립트 엔진으로 C++로 만들어졌다. 자바스크립트 런타임이라는 것은 일종의 자바스크립트을 실행하기 위한 프로그램이다 라고 이해하면 될 것 같다.

 

 

 

Node.js 의 특징


Node.js 의 주요한 특징으로는 4가지를 뽑을 수 있다.

 

1. 런타임

2. 싱글 스레드 

3. 비동기 처리 방식 (논블로킹 I/O)

4. 이벤트 기반 ( Event-driven )

 

하나하나 가벼운 주제가 아니므로 여기서는 간단히만 정리하였다.

 

 

런타임 

 앞서 언급했듯이 Node js 는 자바스크립트 런타임이다.

기존 웹 브라우저에서만 실행 가능한 자바스크립트를 Ryan Dahl이 구글이 만든 V8 엔진을 사용하여 다른 환경에서도 사용이 가능하도록 노드 프로젝트를 시작하였다.

Node js 는 다음과 같은 구조로 구성되어 있다.

 

 < Node js 내부 구조 >

 

  • V8 : V8 라이브러리는 Node js 가 V8 C++ API로 제어하는 자바스크립트 엔진을 제공한다. 

  • libuv : libuv 라이브러리는 C 라이브러리로 논블로킹 I/O 작업을 지원하는 역할을 한다. 파일 시스템, DNS, 네트워크, 파이프, 신호 처리, 폴링, 스트리밍, 자식 프로세스를 다룰 수 있도록 지원한다.

  • http-parser : HTTP 파싱에 사용되는 경량화된 C 라이브러리이다. 

  • c-ares : 일부 비동기 DNS 요청을 위해 사용되는 c 라이브러리이다. 

  • OpenSSL : tls 와 cypto 모듈에서 사용되는 보안을 위한 라이브러리이다.

  • zlib : 빠른 압축과 압축 해제를 위한 산업 표준인 라이브러리이다. Node js 에서는 동기, 비동기, 스트리밍 압축과 압축 해제 인터페이스에 사용된다.

 

 

싱글 스레드

 Node js 는 자바스크립트를 기반으로하기 때문에 싱글 스레드만을 지원한다.

실제 Node js 의 프로세스는 여러 스레드를 가지고 있으나 우리가 사용할 수 있는 스레드가 하나라서 싱글 스레드이다.

Node js 가 이해와 사용이 쉬운 이유 중 하나도 싱글 스레드 덕분인 것 같다. 멀티 스레드에 비해 싱글 스레드가 프로그래밍 난이도가 상대적으로 쉽기 때문이다. 

( ..아무래도 일을 시키더라도 직원을 여러 명 관리하는 것 보다 한 명 관리하는게 쉬우니 )

Node js 가 싱글 스레드를 지원하긴 하지만 멀티 프로세스를 지원하기 때문에 코어를 낭비하는 일은 없다.

노드 클러스터나 pm2 등을 이용하여 멀티 프로세스 구현이 가능하다.

 

 

논블로킹 I/O

 Node js 는 싱글 스레드 기반이기 때문에 작업 처리의 효율성을 위해 논블로킹 I/O 방식을 사용한다. 

( ..일손이 한명이니 블로킹 방식으로는 도저히 작업 진행이 안된다. )

오래 걸리는 작업 A를 백그라운드로 보내서 다음 작업 B를 먼저 실행되게 하고, 작업 A는 다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기다리는 방식이다.

 

 

이벤트 기반(Event-driven)

 Node js 는 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식의 이벤트 기반 모델이다.

이러한 이벤트 기반 모델에서는 논블로킹 I/O 작업을 수행할 수 있도록 해주는 이벤트 루프라는 개념이 존재한다.

구글링했을 때 이벤트 루프에 대한 잘못된 설명이나 오해가 많다고 한다. ( ..역시 공식문서를 봐야한다. )

이벤트 루프 작업 순서는 timer -> pending callbacks -> idle, prepare -> poll -> check -> close callbacks 의 반복이다.

각 단계는 실행할 콜백의 큐(FIFO)를 가진다.

 

< 이벤트 루프 사이클 >

 

  • timer : setTimeout() 과 setInterval() 로 스케줄링한 콜백을 실행한다.

  • pending callbacks : TCP 오류 같은 시스템 작업의 콜백을 실행한다.

  • idle, prepare : 내부용으로만 사용한다.

  • poll : I/O 를 얼마나 오래 블록하고 폴링해야 하는지 계산한 다음 큐에 있는 이벤트를 처리한다.

  • check : setImmediate() 콜백을 호출한다.

  • close callbacks : 소켓이나 핸들이 갑자기 닫힌 경우에 'close' 이벤트를 발생 시킨다. 그렇지 않으면 process.nextTick() 이 실행 된다.

 

 

 

Node js 정리 


 대부분의 플랫폼 혹은 기술들은 자신만의 철학을 가지고 있다. 

Node js의 철학은 "경량화" 라고 할 수 있다. 

경량화된 코어와 모듈을 통해 사용자가 Node js를 쉽게 이해하고 사용하도록 도와주며, 테스트 및 유지 보수를 간단하게 할 수 있도록 도와준다. ( ..Node js는 모듈을 통해 레고를 조립해 나가는 것과 같은 느낌이다. )

하지만 경량화된 만큼 CPU의 연산이 많이 필요한 무거운 작업 보다는 가벼운 작업들을 처리하는데 더 강점이 있다.

 

 

 

 

 

 

 

반응형