Tan Kim

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 집약 작업(이미지 처리, 암호화 등)은 이벤트 루프를 블로킹할 수 있음
  • 메모리 누수 주의 — 이벤트 리스너 등록 후 해제 필수