본문 바로가기

Node.js

[Node] Node의 동작 방식과 장단점

Node?

- Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임

- 런타임 ? 특정언어로 만든 프로그램을 실행할 수 있는 환경

- Javascript 런타임 == Javascript 실행기

 

 

Node의 동작방식

노드는 자바스크립트 언어가 실행되는 실행기라고 보면 되기에, 자바스크립트의 특징을 가지고 있는게 당연 !

1️⃣ 이벤트 기반 (event-driven)

- 이벤트가 발생하면 이벤트 리스터에 등록해 둔 콜백함수 호출 → 발생한 이벤트가 없거나 이벤트를 처리했으면 노드는 다음 이벤트가 발생할 때까지 기다림

 

📌 setTimeout() 으로 Javascript 동작방식 알아보기

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

는 콘솔 출력결과가 어떻게 나타날까?

시작
끝
3초 후 실행

이렇게 나타남!

 

왜 이렇게 나타나는지 알아보기 위해서는 크게 3가지의 키워드를 알아야한다.

1. 이벤트루프

- 이벤트 관리 시, 호출할 콜백함수를 관리 + 호출된 콜백함수의 순서를 결정

- 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복

2. 백그라운드

- setTimeout() 같은 타이머나, 이벤트 리스너들이 대기하는 공간

3. 태스크큐 ( = 콜백큐 )

- 백그라운드에서 보내는 타이머나 콜백함수들이 줄 서 있는 공간

 

이제 그림으로 위의 코드가 실행되는 것을 알아보자!

이렇게 run함수가 호출스택에서 실행되고 호출스택이 아예 비워졌을 경우,

이벤트 루프는 여전히 태스크큐에 콜백함수가 들어올 때까지 대기하게 된다.

 

❗️만약 호출스택에 실행되어야 할 함수들이 너무 많이 들어있으면, run 함수가 제시간에 실행되지 않을 수도 있다

- 이벤트 루프는 호출스택이 비워져있을 때만 run 함수를 호출스택으로 불러올 거니까!

 

 

2️⃣ 동시에 처리될 수 있는 I/O 작업을 최대한 묶어서 백그라운드에서 실행되게 함 ( = 논블로킹 방식 )

- setTimeout(콜백, 0) 활용

 

 

 

3️⃣ 싱글스레드, 논블로킹 모델

싱글 스레드인데 효율적일 수 있는 이유 ?!

- 점원은 한명이고, 여러 손님의 주문을 받는 식당을 예로 들어보자

- 한 손님의 주문을 받고, 주방에 주문 내역을 넘긴 뒤 다음 손님의 주문을 받음

- 요리가 끝나기까지 기다리는 대신, 주문이 들어왔다는 사실만 주방에 계속 알려줌

- 주방에서 요리가 완료되면 완료된 순서대로 손님에게 서빙.

 

멀티 스레드인 경우, 한 손님에 한 점원이 붙는다고 생각하면 됨!

 

 

 

 

Node의 장단점

장점

- 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 적합 ( 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화 )

- 실시간 채팅 애플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버에 많이 사용

- 웹 서버가 내장

- 자바스크립트를 언어로 사용 → 개발 생산의 획기성을 높임

- JSON 형식과 쉽게 호환

 

단점

-  멀티 스레드 프로그래밍을 하더라도 C, C++, Rust, Go와 같은 언어에 비해 속도가 많이 느림

- 따라서 멀티 스레드 기능이 있다고 하더라도 이미지나 비디오 처리, 혹은 대규모 데이터 처리처럼 CPU를 많이 사용하는 작업을 위한 서버로는 권장 X (= CPU 작업이 많은 서버로는 부적합)

- Go처럼 비동기에 강점을 보이는 언어나 nginx처럼 정적 파일 제공, 로드 밸런싱에 특화된 웹 서버에 비해서는 속도가 느림

 

 

 


Reference

- Node.js 교과서 개정 2판