Node

우리가 노드를 사용해야하는 이유

NEMNE 2021. 8. 29. 16:39

 

Node란?

Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다.

런타임(Runtime) : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경

Chrome V8 : C, C++, Rust같은 저수준 언어로 작성된 모듈들을 사용할 수 있게 해주는 웹어셈블리.

Node.js는 브라우저가 아닌 다른 환경에서 Javascript를 사용할 수 있게 해준다.

http://zinirun.blogspot.com/2020/02/nodejs-nodejs.html

위 구조에서 libe 라이브러리가 노드의 핵심 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.

이벤트 기반

이벤트 : 어떠한 사건을 의미한다. (클릭했을 때, 스크롤 했을 때...)

노드는 이벤트 리스너를 생성하고 이벤트가 발생하면 그에 맞는 콜백함수를 호출하는 방식으로 작동한다.

따라서 이벤트가 발생하면 이벤트 리스너에 따라 콜백함수가 실행된다.
또한, 이벤트가 발생하기 전 까지 대기한다.

https://www.zerocho.com/category/JavaScript/post/597f34bbb428530018e8e6e2

제대로 된 이벤트의 처리방식을 알기 위해서는 이벤트 루프와 태스크 큐, 백그라운드의 개념을 이해해야한다.

이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수 관리, 호출된 콜백 함수의 순서 관리

백그라운드 : 이벤트 리스너가 대기하는 장소. 여러 작업이 동시에 실행될 수 있음 (Timer, I/O, 이벤트 리스너)

태스크큐 : 백그라운드에서 나온 리스너가 실행되는 장소. 순서대로 실행됨. (특정한 경우에 순서가 바뀔 수도 있음)

논 블로킹 I/O

작업은 크게 2가지 방식으로 나뉨.

  1. 동시에 작업할 수 있는지
  2. 동시에 작업을 못하는지

1번은 우리가 직접 작성하는 자바스크립트 코드 말고 I/O 작업 같은 것을 동시에 작업할 수 있다.

2번은 우리가 작성한 자바스크립트 코드이다.

따라서 동시에 작업할 수 있는 1번은 노드에서 이벤트 기반 모델을 통해 동시에 작업하는데 이를 논 블로킹이라고 한다.

논 블로킹 : 이전 작업이 완료할 때까지 기다리지 않고 바로 작업을 수행한다. (1번)
블로킹 : 이전 작업이 완료할 때까지 기다린다. (2번)

논 블로킹의 장점 : 동시에 작업하여 시간이 줄어든다.

블로킹 논 블로킹 예제


function longRunningTask1(){
    // must spend long time
}

console.log('시작');
longRunningTask1();
console.log('next');

위 작업은 블로킹 방식으로 시작 후 longRunningTask1가 끝나야지 다음 작업을 할 수 있다.


function longRunningTask1(){
    // must spend long time
}

console.log('시작');
setTimeout(longRunningTask1(), 0);
console.log('next');

위 작업은 논 블로킹 방식으로 시작 후 빨리 끝날 수 있는 next작업이 실행되고 그 다음으로 longRunningTask1가 실행되는 것을 알 수 있다.

예시처럼 논 블러킹은 동시에 여러작업을 처리할 수 있을 뿐만 아니라 빨리 끝나는 작업을 "우선적"으로 처리할 수도 있다.

싱글 쓰레드

싱글 쓰레드의 개념을 알기 전에 쓰레드와 프로세스를 이해해야한다.

프로세스 : 운영체제가 할당하는 작업의 단위, 프로세스간에 메모리 공유는 못한다. 일종의 공장.

쓰레드 : 프로세스 내에서 실행되는 흐름의 단위, 프로세스 내에 여러 쓰레드가 있고 쓰레드는 프로세스 내에 있는 메모리를 공유할 수 있다. 일종의 공장 직원.

따라서 노드는 공장직원이 한명인 싱글스레드인 것이다.

정확하게 말하면 개발자가 다룰 수 있는 직원이 한명 뿐인 것이다.

싱글 쓰레드의 장단점

단점 : 직원이 한명이기 때문에 여러가지의 작업물을 처리하기에는 벅차다.

장점 : 직원을 고용하거나 해고하는 비용이 발생하지 않음.

앞에 말한 단점도 한명의 직원이 여러 작업을 동시에 처리하면 된다.

그러면 여러명의 직원이 여러 작업을 동시에 처리하면 안되는가?(멀티 쓰레딩) => 코딩 하기 어려움

그래서 그나마 나은 멀티 프로세싱 방식을 사용.(I/O 요청이 많을 때 사용)

따라서 노드에서 개발을 할 때 싱글쓰레드가 죽지 않도록 잘 관리해야 한다.

서버로서의 노드

노드의 장점을 다시보면 다음과 같다.

  1. 싱글 쓰레드
  2. 논 블로킹 모델

서버로서의 노드는 I/O처리가 많을 때 사용하면 된다. 즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받을 때 적합하다. (실시간 채팅 앱, JSON 데이터 제공 API)

그러나 CPU를 과하게 사용하는 즉, 멀티 쓰레딩 방식을 사용하는 경우에는 적합하지 않다.

따라서 노드는 생산성은 매우 좋지만(자바스크립트로 작성) 멀티쓰레딩, 과도한 CPU 작업, 싱글 쓰레드, 애매한 성능등의 단점으로 인해 충분히 고려 후 사용해야한다.