Node.js
Node.js는 Chrome V8 엔진 기반의 JavaScript 런타임이다. 싱글 스레드 + 이벤트 루프 아키텍처로 비동기 I/O를 효율적으로 처리하며, 백엔드 서버 개발에 널리 사용된다.
개요
| 항목 | 내용 |
|---|---|
| 엔진 | V8 (Google Chrome) |
| 스레드 모델 | 싱글 스레드 |
| I/O 모델 | 비동기, Non-blocking |
| 패키지 매니저 | npm, yarn, pnpm |
이벤트 루프 (Event Loop)
이벤트 루프는 Node.js가 싱글 스레드임에도 비동기 작업을 처리할 수 있는 핵심 메커니즘이다. 콜 스택이 비어있을 때 이벤트 큐에서 콜백을 꺼내 실행한다.
이벤트 루프 단계
timers → pending callbacks → idle/prepare → poll → check → close callbacks
| 단계 | 처리 내용 |
|---|---|
| timers | setTimeout, setInterval 콜백 실행 |
| poll | I/O 이벤트 대기 및 처리 |
| check | setImmediate 콜백 실행 |
마이크로태스크 큐
이벤트 루프의 각 단계 전후에 마이크로태스크 큐를 먼저 소진한다.
Promise.resolve()콜백queueMicrotask()process.nextTick()(가장 높은 우선순위)
비동기 패턴
Callback
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});Promise
fs.promises.readFile('file.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));async/await
현재 Node.js에서 가장 권장되는 패턴이다.
async function readFile() {
try {
const data = await fs.promises.readFile('file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}주요 내장 모듈
| 모듈 | 기능 |
|---|---|
fs |
파일 시스템 접근 |
path |
경로 처리 |
http / https |
HTTP 서버/클라이언트 |
crypto |
암호화 |
stream |
스트림 처리 |
child_process |
자식 프로세스 실행 |
적합한 사용 사례
- API 서버: REST, GraphQL API
- 실시간 서비스: WebSocket 기반 채팅, 알림
- I/O 집약 서비스: 파일 처리, DB 쿼리가 많은 서비스
- BFF(Backend for Frontend): 프론트엔드를 위한 중간 레이어
주의사항
- CPU 집약 작업(이미지 처리, 암호화 등)은 이벤트 루프를 블로킹할 수 있음
- 메모리 누수 주의 — 이벤트 리스너 등록 후 해제 필수