Node.js 란?
2024. 3. 5. 18:21

Node.js 개념 정리 – 싱글 스레드로 어떻게 비동기 처리를 할 수 있을까?

Node.js란?

  • 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 런타임 환경
  • JavaScript를 활용하여 Non-blocking I/O단일 스레드 이벤트 루프 기반의 높은 처리 성능 제공
  • Chrome V8 엔진 + libuv (비동기 이벤트 처리 라이브러리) 조합
  • 내장 HTTP 서버를 가지고 있어 별도 Apache 없이도 웹서버 동작 가능

Node.js는 싱글 스레드인가?

  • 흔히 Node.js는 싱글 스레드다라고 하지만, 정확히는 "JavaScript를 실행하는 스레드가 싱글"일 뿐
  • 실제로는 libuv가 멀티 스레드 기반의 작업 처리 백엔드를 제공함

libuv란?

  • Node.js에서 사용하는 C/C++ 기반의 비동기 I/O 처리 라이브러리
  • OS 커널의 비동기 API 지원 여부에 따라 전략적으로 처리
    • OS에서 비동기 처리를 지원하면 커널에 위임
    • 지원하지 않으면 libuv가 관리하는 스레드 풀(thread pool)을 이용해 처리
  • 기본적으로 4개의 워커 스레드를 포함한 풀 구성

이벤트 루프란?

  • Node.js의 싱글 스레드 메인 루프

  • 비동기 작업을 순차적으로 처리해주는 매니저 역할

  • 아래와 같은 Phase로 구성됨:

    • Timer Phase
    • Pending Callbacks
    • Idle/Prepare
    • Poll
    • Check
    • Close Callbacks

    각 Phase를 순회하며 처리하는 단위를 tick이라 부름


논블로킹 I/O 처리 흐름 요약

  1. JavaScript 메인 스레드는 libuv에 I/O 작업을 요청
  2. libuv는 OS 커널 or 자체 thread pool을 활용해 작업을 수행
  3. 작업 완료 시 콜백 큐에 추가 → 이벤트 루프가 꺼내서 처리
  4. 메인 스레드는 계속 다른 요청을 받고 처리 가능

비동기와 이벤트 루프

  • 비동기란: 작업이 완료되지 않아도 다음 코드 실행이 가능하다는 것 (동시성)
  • Node.js는 싱글 스레드임에도 이벤트 루프 + libuv 덕분에 동시성 비동기 처리가 가능

핵심 정리

요소 설명
Node.js JavaScript 런타임 환경 (V8 + libuv)
libuv 비동기 I/O를 처리하는 C/C++ 라이브러리
이벤트 루프 비동기 작업을 순차적으로 처리하는 싱글 스레드 루프
스레드풀 libuv 내부의 백그라운드 처리용 멀티 스레드

단일 스레드로도 동시성 비동기 처리를 해내는 Node.js의 핵심은
바로 이벤트 루프 + libuv의 백그라운드 처리 능력입니다.