node

node 핵심 개념

bonschicken 2025. 4. 3. 14:29
728x90

Node.js란?

2008년, 구글은 V8 엔진을 기반으로 크롬 브라우저를 출시했습니다. 당시 V8 엔진은 다른 JavaScript 엔진에 비해 매우 빠르며, 오픈소스로 공개되었기 때문에 많은 주목을 받았습니다. 속도 문제가 해결되자, V8 엔진을 기반으로 한 Node.js 프로젝트가 시작되었습니다.

Node.js 공식 홈페이지에서는 Node를 다음과 같이 정의합니다:

Node.js는 비동기 이벤트 기반의 JavaScript 런타임으로, 확장 가능한 네트워크 애플리케이션을 구축하도록 설계되었습니다.

조금 더 나아가 Node.js의 내부 구조에 대해 간단히 살펴보겠습니다.

 


Node.js의 내부 구조

Node.js는 크게 V8 엔진, libuv, C++ 바인딩, 그리고 표준 라이브러리로 구성되어 있습니다.

구조는 다음과 같습니다:

 

+-------------------------------------------------+
|                     Node.js                     |
| +---------------------------------------------+ |
| |              V8 JavaScript Engine           | |
| +---------------------------------------------+ |
| +---------------------------------------------+ |
| |                     libuv                   | |
| |  +----------------+  +--------------------+ | |
| |  | 이벤트 루프    |  | 비동기 I/O          | | |
| |  +----------------+  +--------------------+ | |
| +---------------------------------------------+ |
| +---------------------------------------------+ |
| |                C++ 바인딩                   | |
| +---------------------------------------------+ |
| +---------------------------------------------+ |
| |              Node.js 표준 라이브러리         | |
| +---------------------------------------------+ |
+-------------------------------------------------+

 

 

  • V8과 libuv는 C++로 구현되어 있으며,
  • JavaScript 코드는 Node가 V8과 libuv에 적절히 연결해 실행해 줍니다.
  • libuv는 Node의 핵심 특징인 비동기 I/O이벤트 기반 모델을 구현하고 있습니다

 

이벤트 기반이란?

이벤트 기반이란, 특정 이벤트가 발생했을 때 미리 지정한 작업(콜백 함수)을 수행하는 방식을 의미합니다.

이벤트 기반 시스템에서는 어떤 이벤트가 발생했을 때 어떤 동작을 할지를 이벤트 리스너를 통해 미리 등록해야 합니다.

Node.js도 이러한 이벤트 기반 방식으로 동작합니다.

  • 이벤트가 발생하면, 이벤트 리스너에 등록된 콜백 함수가 실행됩니다.
  • 처리할 이벤트가 없으면, Node는 다음 이벤트가 발생할 때까지 대기합니다.

아래 그림은 동작되는 모습을 추상화한 그림입니다.

 

 

 


 

이벤트 루프

이벤트 기반 모델에서는 **이벤트 루프(Event Loop)**라는 개념이 등장합니다. 이벤트 루프의 주요 역할은 다음과 같습니다:

  • 여러 이벤트가 동시에 발생했을 때, 어떤 순서로 콜백 함수를 호출할지를 판단합니다.

이벤트 루프를 잘 활용하면, 오래 걸리는 작업도 효율적으로 처리할 수 있습니다.

 

자바스크립트 코드는 기본적으로 동시에 실행되지 않지만, I/O 작업처럼 자바스크립트 외부에서 수행되는 작업은 동시에 처리할 수 있습니다. 이를 통해 전체 작업 시간을 줄일 수 있습니다.

 


논블로킹 vs 비동기

개념 관계
블로킹 호출한 함수가 바로 응답을 주고 기다리고 있음 실행 방식에 관한 이야기
논블로킹 호출한 함수가 바로 응답을 주고 기다리지 않음 실행 방식에 관한 이야기
비동기 호출한 작업이 끝나면 나중에 알림을 줌 처리 순서/구조에 관한 이야기

 

커피 주문에 비유 한다면?

상황 설명
논블로킹 커피 주문했는데, 잠깐 다른 일 하다가 다시 와서 커피 나왔나 물어보는 것
비동기 커피 주문했는데, 벨 울리면 찾으러 가는 것 (끝났을 때 자동 알림)

Node는 싱글 스레드 기반?

Node.js는 싱글 스레드 기반으로 동작합니다.

  • 싱글 스레드는 말 그대로, 하나의 스레드만으로 JavaScript 코드를 처리한다는 의미입니다.

하지만, 엄밀히 말하면 Node.js는 내부적으로 멀티 스레드를 사용합니다.
Node.js를 실행하면 하나의 프로세스가 생성되고, 그 안에서 여러 스레드가 만들어집니다. 다만, JavaScript 코드를 실행하는 스레드는 하나뿐이기 때문에 일반적으로 "싱글 스레드"라고 표현합니다.


예외: Node의 멀티 스레드 사용

Node.js가 싱글 스레드만 사용하는 건 아닙니다. 다음 두 가지 경우에는 멀티 스레드를 사용합니다:

  1. 스레드 풀 (Thread Pool)
    • libuv가 제공하며, I/O, 암호화, 압축 등 일부 작업에 대해 백그라운드에서 멀티 스레드로 처리합니다.
  2. 워커 스레드 (Worker Threads)
    • Node.js 12버전부터 안정화된 기능으로, 직접 여러 개의 스레드를 생성해 CPU 작업 등을 병렬 처리할 수 있습니다.

 

싱글 스레드의 한계와 멀티 스레딩의 장단점

Node.js의 싱글 스레드는 다음과 같은 단점을 가집니다:

  • 하나의 스레드가 모든 작업을 처리하므로, 해당 스레드에 문제가 생기면 전체 프로그램이 영향을 받습니다.
  • CPU를 많이 사용하는 작업에서는 성능이 저하될 수 있습니다.

비교

싱글 vs 멀티 스레딩

항목 멀티 스레딩 싱글 프로세싱
구조 하나의 프로세스 안에서 여러 개의 스레드 사용 하나의 프로세스
사용 환경 CPU 작업이 많이 사용될 때 사용 구조가 단순할때 사용
프로그래밍 난이도 프로그래밍이 어려움 비교적 쉬움


멀티 스레딩 vs 멀티 프로세싱

항목 멀티 스레딩 멀티 프로세싱
구조 하나의 프로세스 안에서 여러 개의 스레드 사용 여러개의 프로세스 사용
사용 환경 CPU 작업이 많이 사용될 때 사용 I/O 요청이 많을때 사용
프로그래밍 난이도 프로그래밍이 어려움 비교적 쉬움