Node.js는 정말 싱글 스레드일까?

Node.js는 싱글 스레드일까, 멀티 스레드일까?

최근 TypeScript 서버에서 여러 유저에 대한 로직을 빠르게 처리해야 하는 상황이 있었다.

빠른 처리를 위해 병렬 처리가 필요하다고 생각했는데 “Node.js는 싱글 스레드”라고 알려져 있어서 정말 병렬 처리가 가능한지 궁금해 더 깊게 공부하게 되었다.

이번 글에서는 그 과정을 정리해보고자 한다.

동시성과 병렬성

먼저 용어부터 정리해보자.

  • 동시성(Concurrency): 하나의 스레드가 여러 작업을 번갈아가며 처리하는 것
  • 병렬성(Parallelism): 여러 스레드가 물리적으로 동시에 작업을 처리하는 것

JavaScript 코드는 Node.js 런타임에서 싱글 스레드 이벤트 루프 위에서 실행되기 때문에 기본적으로는 동시성을 지원한다.

다만 I/O 작업은 커널이나 Node.js 내부 모듈(libuv)이 대신 처리하기 때문에 JS 코드 실행과 I/O가 동시에 진행될 수 있다. 이 때문에 “Node.js도 병렬 처리가 가능하다”라는 오해가 생기곤 한다.

Node.js에서의 멀티 스레드 – Worker Threads

Node.js에서는 Worker Threads 모듈을 통해 멀티 스레드를 활용할 수 있다.

  • Worker Thread는 새로운 스레드를 만들어 독립적인 자바스크립트 실행 환경을 제공한다.
  • 하지만 일반적인 언어의 스레드와 달리 **자원을 공유하지 않고 메시지(Message Passing)**로만 통신한다. (메시지 기반 통신에서 사용하는 기술에 대해서는 다음에 더 깊이 다뤄보고자 한다.)
  • postMessage와 on(‘message’) 이벤트를 이용해 데이터를 주고받는다.

이 방식은 동기화 문제를 피할 수 있지만, 동시에 자원 공유가 불가능하다는 특징이 있다.

Node.js는 왜 여전히 “싱글 스레드"일까?

Worker Thread가 있다고 해서 Node.js가 멀티 스레드 런타임이 되는 것은 아니다.

왜냐하면 Node.js의 핵심 구조는 여전히 “이벤트 루프 + 메인 스레드” 기반이기 때문이다.

Worker Thread는 별도의 스레드를 추가할 수는 있지만, 이벤트 루프가 새로 생기는 것은 아니다.

따라서 **Node.js는 기본적으로 싱글 스레드 이벤트 루프 기반 런타임이지만 필요에 따라 멀티 스레드를 활용할 수 있다”**라고 이해하는 것이 맞다.

libuv와 스레드 풀

Node.js가 내부적으로 사용하는 핵심 엔진 중 하나가 바로 libuv이다. libuv는 이벤트 루프를 구현하고 있으며, 자체적으로 **스레드 풀(Thread Pool, 기본 4개)**을 가지고 있다. 이 스레드 풀은 주로 블로킹 I/O 작업을 처리합니다.

  • 블로킹 I/O (파일 시스템) → libuv의 스레드 풀에서 처리
  • 네트워크 I/O (소켓, DB 연결) → 커널이 제공하는 Non-blocking I/O (epoll, kqueue, IOCP 등)를 활용

즉 이벤트 루프는 블로킹 작업을 직접 처리하지 않고 libuv가 스레드 풀이나 커널의 비동기 기능을 활용해 위임하는 구조이다.

다이어그램으로 보는 Node.js 구조

Image

이 다이어그램을 통해 구조를 정리하면:

  • 메인 스레드(이벤트 루프): JS 코드를 실행하고 이벤트를 관리
  • Worker Thread: 별도의 스레드로 실행, 메인 스레드와 메시지로만 통신
  • libuv: 이벤트 루프 구현 + 스레드 풀 관리
  • OS 커널: 네트워크 I/O를 비동기적으로 처리, 파일 시스템은 블로킹이므로 스레드 풀에서 처리

정리

  • Node.js는 기본적으로 싱글 스레드 이벤트 루프 기반으로 동작한다.
  • 하지만 Worker Threads를 통해 멀티 스레드 병렬 작업도 가능하다.
  • libuv의 스레드 풀은 파일 I/O 같은 블로킹 작업을 처리한다.
  • 네트워크 I/O는 커널의 비동기 처리 기능을 활용한다.

👉 따라서 Node.js는 “싱글 스레드 + 비동기 이벤트 루프”라는 본질을 유지하면서, 필요할 때 멀티 스레드(Worker Threads)를 활용할 수 있는 유연한 구조라고 볼 수 있다.