Node.js
개요
Node.js는 Ryan Dahl이 2009년에 개발한 JavaScript 기반의 오픈소스 서버 사이드 런타임 환경이다. Chrome V8 자바스크립트 엔진을 기반으로 동작하며, 비동기(Asynchronous) 이벤트 기반 모델을 채택해 대규모 네트워크 애플리케이션에 최적화되어 있다.
Node.js는 기존에 웹 브라우저에서만 실행되던 JavaScript를 서버 환경에서도 사용할 수 있도록 만든 런타임이다. 싱글 스레드 구조이지만 이벤트 루프와 비동기 I/O를 활용해 수천 개의 연결을 동시에 처리할 수 있다.
주요 특징
| 항목 | 설명 |
|---|---|
| 엔진 | Chrome V8 JavaScript Engine 기반 |
| 언어 | JavaScript, TypeScript |
| 구조 | 싱글 스레드 + 이벤트 루프 모델 |
| 비동기 처리 | libuv를 통한 Non-blocking I/O |
| 패키지 관리자 | npm (Node Package Manager) |
| 플랫폼 지원 | Windows, Linux, macOS |
| 확장성 | C++, Rust, WASM 네이티브 모듈 연동 가능 |
역사
| 연도 | 버전/사건 | 주요 내용 |
|---|---|---|
| 2009 | 첫 공개 | Ryan Dahl, V8 기반 비동기 런타임 발표 |
| 2011 | npm 통합 | Node.js 패키지 관리 생태계 등장 |
| 2014 | io.js 분기 | 커뮤니티 포크(io.js) 등장 |
| 2015 | Node.js 재통합 (v4.0) | io.js 병합, LTS 체계 확립 |
| 2018 | Node.js 10 LTS | async/await, HTTP/2 지원 |
| 2020 | Node.js 14+ | ES Modules, Diagnostics Channel 도입 |
| 2023 | Node.js 20 | WebAssembly, fetch API 기본 지원 |
동작 구조
Node.js의 내부 구조는 다음과 같다:
| 계층 | 구성 요소 | 역할 |
|---|---|---|
| 언어 계층 | JavaScript | 애플리케이션 코드 실행 |
| 엔진 계층 | V8 Engine | 자바스크립트 → 기계어 변환 |
| 런타임 계층 | libuv, c-ares | 비동기 I/O, 이벤트 루프 처리 |
| 바인딩 계층 | C++ Addon, N-API | 네이티브 모듈과 상호작용 |
| 시스템 계층 | OS Kernel | 파일, 네트워크, 프로세스 관리 |
이벤트 루프 (Event Loop)
Node.js의 핵심 구조는 이벤트 루프(Event Loop) 이다. 이는 싱글 스레드 환경에서도 다중 요청을 동시에 처리할 수 있게 한다.
console.log('Start');
setTimeout(() => {
console.log('Async Task');
}, 1000);
console.log('End');
npm (Node Package Manager)
npm은 Node.js의 공식 패키지 관리 도구로, 전 세계에서 가장 큰 오픈소스 모듈 저장소를 제공한다.
기본 명령어:
npm init # 프로젝트 초기화
npm install express # 모듈 설치
npm run start # 스크립트 실행
또한 Yarn, pnpm 등의 대체 패키지 관리자도 존재한다.
주요 모듈
Node.js는 표준 모듈 세트를 포함하고 있으며, 외부 패키지와 함께 풍부한 개발 생태계를 구성한다.
| 범주 | 모듈 | 설명 |
|---|---|---|
| 파일 시스템 | fs | 파일 읽기/쓰기 |
| 네트워킹 | http, net, dns | 서버 및 TCP 통신 |
| 운영체제 | os | 시스템 정보 조회 |
| 이벤트 | events | 이벤트 생성 및 구독 |
| 스트림 | stream | 데이터 스트리밍 처리 |
| 암호화 | crypto | 해시, 암호화 연산 |
| 프로세스 | child_process | 외부 명령 실행 |
예제 코드
간단한 웹 서버 예시:
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, TechPedia!\n');
}).listen(8080);
console.log('Server running on http://localhost:8080');
성능 특징
- V8 JIT을 통한 빠른 실행 속도
- libuv 기반 비동기 이벤트 루프
- 낮은 리소스 점유로 고동시성(High Concurrency) 지원
- Cluster 모듈로 멀티코어 활용 가능
- Worker Threads로 병렬 처리 확장
Node.js와 Deno, Bun 비교
| 항목 | Node.js | Deno | Bun |
|---|---|---|---|
| 개발자 | Ryan Dahl (2009) | Ryan Dahl (2018) | Jarred Sumner (2022) |
| 엔진 | V8 | V8 | JavaScriptCore |
| 언어 | JavaScript, TypeScript | TypeScript 기본 지원 | JS/TS/JSX |
| 패키지 시스템 | npm | URL Import | npm 호환 + 자체 빌트인 |
| 보안 모델 | 제한적 | 샌드박스 기반 | 네이티브 모듈 통합 |
| 속도 | 빠름 | 빠름 | 매우 빠름 (Zig 기반 런타임) |
활용 분야
- 웹 서버 및 API 서버
- 실시간 통신 (WebSocket, Socket.IO)
- CLI 도구, 빌드 시스템
- IoT 디바이스 백엔드
- Electron 기반 데스크톱 앱
- Serverless Computing (AWS Lambda, Vercel)
Node.js와 TypeScript
Node.js는 TypeScript와 결합해 대규모 애플리케이션 개발에 자주 사용된다. TS를 Node.js에서 실행하기 위해 ts-node 또는 Bun, Deno 같은 런타임이 함께 쓰인다.
현대 트렌드
- ES Modules(ESM) 완전 지원
- fetch API 및 Web Streams 내장
- WebAssembly 실행 지원
- Rust 기반 네이티브 모듈 확장 증가
- Bun, Deno와의 런타임 경쟁
- Edge Computing 및 Serverless 확장
같이 보기
- JavaScript
- TypeScript
- V8 Engine
- libuv
- npm
- Deno
- Bun
- Electron
- Express
- Next.js
- Serverless Computing
- Vercel
참고 문헌
- Node.js Documentation – Official Site
- Ryan Dahl, “Introduction to Node.js”, JSConf (2009)
- libuv Project Documentation
- npm Registry Reference
- Google V8 Engine Docs
- Deno vs Node.js Comparison, 2024 TechRadar Report