Node.js는 Chrome V8 자바스크립트 엔진 위에 구축된 자바스크립트 런타임(JavaScript Runtime) 입니다. 흔히 런타임이란 특정 언어로 작성된 코드를 실행할 수 있는 환경을 의미하며, Node.js는 자바스크립트로 작성된 애플리케이션을 웹 브라우저 외부, 즉 서버 환경에서 실행할 수 있게 해주는 플랫폼입니다.
원래 자바스크립트는 웹 브라우저 내에서만 동작하는 스크립트 언어였습니다. 이는 브라우저가 자바스크립트 런타임(예: V8, SpiderMonkey 등)을 내장하고 있었기 때문입니다. 하지만 2009년, 라이언 달(Ryan Dahl)이 V8 엔진과 libuv라는 라이브러리를 조합하여 Node.js를 만들어냄으로써, 자바스크립트를 브라우저 밖으로 끄집어낼 수 있게 되었고, 오늘날에는 백엔드 서버 개발에도 널리 사용되고 있습니다.
Node.js의 핵심은 단순히 자바스크립트를 서버에서 실행한다는 데에만 있지 않습니다. 이벤트 기반(Event-driven) 아키텍처와 비동기 I/O 모델, 그리고 싱글 스레드 기반의 구조를 통해 고성능 네트워크 애플리케이션을 손쉽게 구축할 수 있는 구조적 장점을 가지고 있습니다. 그 특성들을 하나씩 살펴보겠습니다.
이벤트 기반 비동기 프로그래밍
Node.js는 싱글 스레드 환경에서 동작하면서도 고성능을 발휘할 수 있는 이유는 이벤트 기반(event-driven) 비동기 프로그래밍 모델 덕분입니다. 내부적으로는 libuv라는 C 기반 라이브러리를 사용해 파일 시스템 접근, 네트워크 요청, DNS 조회, 타이머 관리 등 다양한 I/O 작업을 논 블로킹(non-blocking)으로 처리합니다.
libuv는 I/O 작업이 완료되면 Node.js의 Event Loop에 신호를 전달합니다. 이 이벤트 루프는 큐에 있는 콜백을 스케줄링하고, 콜 스택(Call Stack)이 비어있는 순간에 해당 콜백을 실행합니다. Node.js는 이 메커니즘을 통해 동시에 수천 건의 연결을 효율적으로 처리할 수 있으며, 이는 다른 전통적인 블로킹 I/O 기반 서버들과 차별되는 강력한 장점입니다.
특히 작업이 비동기로 처리되기 때문에 CPU 리소스를 블로킹하지 않고, 다른 작업을 계속해서 수용할 수 있는 구조입니다. 이로 인해 실시간 채팅 시스템, 스트리밍 서버, REST API 서버처럼 동시성(Concurrency)이 중요한 애플리케이션 개발에 매우 적합합니다.
Non-blocking I/O
Node.js의 모든 I/O 작업은 기본적으로 non-blocking입니다. 예를 들어 파일을 읽는 fs.readFile() 같은 API는 파일을 읽는 동안 기다리지 않고, 콜백 혹은 프로미스(Promise)를 통해 완료 시점을 처리합니다. 서버는 해당 작업을 위임한 후 즉시 다음 요청을 처리할 수 있으므로, 동시 요청 처리 효율이 극대화됩니다.
이러한 논블로킹 I/O는 Node.js를 고속 네트워크 애플리케이션에 적합하게 만듭니다. 특히 I/O 중심의 애플리케이션(예: DB와의 빈번한 통신, 외부 API 호출)이 많은 경우, 스레드를 대기 상태로 두지 않기 때문에 자원 사용이 극히 효율적입니다.
싱글 스레드 아키텍처와 내부 병렬 처리
Node.js는 본질적으로 싱글 스레드(Single Thread) 환경에서 동작합니다. 하나의 메인 스레드에서 이벤트 루프를 돌리며, 모든 코드 실행과 콜백 처리를 담당합니다. 이 구조는 멀티스레드 환경에서 발생할 수 있는 동기화 이슈, 컨텍스트 스위칭 비용 등을 줄이는 데 효과적입니다.
그렇다고 해서 Node.js가 병렬 처리를 못하는 것은 아닙니다. 내부적으로는 libuv의 스레드 풀을 사용해 일부 작업(파일 시스템 접근, DNS 조회 등)을 백그라운드에서 병렬 처리하며, 결과는 이벤트 루프를 통해 다시 콜백 형태로 전달됩니다.
또한 Node.js는 worker_threads 모듈을 통해 실제 멀티스레딩도 지원합니다. 이는 CPU 연산이 많은 작업을 별도의 스레드에서 처리하게 함으로써, 메인 이벤트 루프의 병목을 줄일 수 있습니다. 따라서 Node.js는 CPU-bound 작업과 I/O-bound 작업 모두를 다룰 수 있는 유연한 구조를 가지고 있습니다.
reference
- Node.js 공식 홈페이지: https://nodejs.org/en/
- libuv GitHub: https://github.com/libuv/libuv
- Node.js Event Loop 설명: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
- Node.js Worker Threads: https://nodejs.org/api/worker_threads.html
- Node.js ESM 모듈: https://nodejs.org/api/esm.html
- Node.js V8 엔진 개요: https://nodejs.org/en/docs/guides/understanding-v8/
'Project > Node.js' 카테고리의 다른 글
내가 아는 Node.js -3 (0) | 2025.05.28 |
---|---|
내가 아는 Node.js -2 (0) | 2025.05.28 |
Node.js 시스템에서 비동기 대기 처리(Queueing)의 필요성 (0) | 2025.05.23 |
Node.js의 GC(Garbage Collection) (1) | 2025.05.23 |
공식문서에서 EventLoop의 MacroQueue를 (0) | 2024.12.04 |