Node.js는 무엇인가?

uoM·2021년 2월 24일
4

Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다.
Node.js는 이벤트 기반, 논 블록킹 I/O 모델을 사용해 가볍고 효율적이다. 또한 패키지 매니저인 npm은 가장 오픈소스 라이브러리 생태계이다.

Node.js가 서버라고 생각하는 것은 틀렸다.

실제로 자바스크립트로 만들어진 프로그램을 구동시켜주는 환경이 정확한 표현이다.

하지만, 우리는 Node.js를 보통 서버로 사용하게 된다.

서버란?

서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

  • 클라이언트 - 요청을 보내는 주체

    ex)브라우저, 데스크톱 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버, 등...

모바일 앱을 설치하게되면, 우리는 앱을 골라서 설치 버튼을 누르는 행위(요청)을 하면, 내려받기(응답)을 하게 됩니다. 앱 설치파일은 이미 어딘가에 저장되어 있고, 그 데이터를 받아와 모바일 기기에 설치하게 된다.

앱 설치파일이 저장되어있는 어딘가는 애플이나 구글의 서버가 된다. 우리가 앱을 받는 앱스토어, 플레이 스토어가 클라이언트가 되는 것이다.

Node.js의 특징

  1. 자바스크립트 런타임
  2. 이벤트 기반
  3. 논 블록킹 I/O
  4. 싱글 스레드

자바스크립트 런타임

  • 런타임이란?

특정 언어로 만든 프로그램들을 실행할 수 있는 환경

구글이 V8엔진을 발표하며, 자바스크립트 생태계에 큰 변화가 생겼습니다.

V8엔진이 나오며 브라우저 밖에서의 자바스크립트 실행속도가 빠르게 향상되었고, V8엔진은 오픈소스로 공개되어 있었습니다.

node.js 내부 구조

Node.js는 우리의 코드를 코어 라이브러리를 통해 모듈로 구동하며, 해당 내용을 V8 엔진과 libuv를 통해 처리한다.

V8엔진은 JS & C++로 구현되어 있으며, libuv는 C / C++로 구성되어 있다.
각각 V8엔진은 자바스크립트를 구동하는데 역할을 하며, libuv를 통해 이벤트 기반 및 논 블록킹 I/O 모델을 구현하고 있다.

이벤트 기반

특정한 이벤트가 발생할 때마다 미리 지정해둔 작업을 수행하는 방식

이벤트에는 네트워크 요청, 클릭등이 있을 수 있다.

이처럼 Node.js에서 시스템을 구축할 때, 어떤 이벤트가 발생할 지를 미리 등록해야하며, 해당 이벤트가 발생했을때 알맞은 처리 방법을 구현해야 한다.

이것은 이벤트 리스너에 콜백 함수를 등록하여 처리한다.

브라우저에서 버튼을 누르면 경고창을 띄우도록 한다면, 클릭 이벤트가 발생하고 콜백을 통해 경고창을 띄우게 된다.

이벤트 기반에서 가장 중요시 되는 것은 이벤트 루프이다.
이벤트 루프가 콜백의 호출 순서를 정하고, 작업을 진행한다.

  • 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불립니다.
  • 태스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간입니다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 부릅니다.
  • 백그라운드: 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳입니다.

기본적으로 브라우저 상에서 자바스크립크가 동작하는 방식과 똑같다.

1) 이벤트 루프를 통해 함수를 호출 스택에 쌓는다.

2) 호출된 함수를 백그라운드작업에 넘겨야 하는지 판단하여 실행하거나 백그라운드 작업으로 이관한다.

3) 백그라운드는 작업한 결과를 태스크큐에 저장한다.

4) 태스큐 큐에 저장된 콜백은 호출스택이 모두 비워진 상태에서만 실행된다.

논 블로킹 I/O

어떠한 작업 요청을 하였을 때, 해당작업의 결과에 상관없이 다음 작업을 진행하는 것을 논 블로킹이라고 한다.

실제로 논 블로킹 I/O는 input / output의 논블로킹 모델을 말하며, 브라우저에서는 setTimeout( callback, 0)으로 구현할 수 있다.

싱글 스레드

Node.js는 기본적으로 싱글 스레드의 논 블로킹 I/O 방식이다.

한마디로, 한번에 여러가지 일을 받아서 진행하며, 그 처리 결과가 나오는 순서에 따라 출력해준다고 생각 할 수 있다.

다만, Node.js에서도 멀티 스레드를 적용할 수 있다. 실제로는 멀티 스레드라기 보다 멀티 프로세싱이라고 하는게 맞다.

프로세스와 스레드의 차이는 프로세스는 프로그램 단위고 스레드는 프로세스 안에서 사용하는 작업 흐름의 단위 이다. (cluster, pm2에서 멀티 프로세싱을 하는 법을 알 수 있다.)

장점과 단점

노드의 장점

  • 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용
  • I/O 작업이 많은 서버로 적합 (채팅)
  • 멀티 스레드 방식보다 쉬움
  • 웹서버가 내장되어 있음 (node.js library)
  • 자바스크립트를 사용함 (사용이 쉬움)
  • JSON 형식과 호환이 쉬움

노드의 단점

  • 싱글 스레드라서 CPU 코어 하나만 사용함 (작업이 크면 타격이 큼)
  • CPU 작업이 많은 서버로는 부적합
  • 하나뿐인 스레드가 멈추지 않도록 관리해야함 (죽으면 서버가 죽음)
  • 서버 규모가 커졌을 때 서버를 관리하기 어려움
  • 어중간한 성능

reference

node.js 교과서 (조현영 지음)

0개의 댓글