Skip to content

Node.js

YooByWk edited this page Oct 26, 2025 · 1 revision

Node.js

개요

Node.js는 google 크롬의 V8 JavaScript 엔진을 기반으로 구축된 오픈소스, 크로스 플랫폼 JavaScript 런타임 환경이다. 서버 측 네트워킹 및 고성능 I/O 중심의 애플리케이션을 구축하는데 중점을 두며, 비동기 및 이벤트 구동형 아키텍처를 채택한다.

Node.js를 통해 브라우저 환경이 아닌 CLI, 서버 등 다양한 환경에서 JavaScript를 사용할 수 있게 되었으며, FE와 BE 개발 언어를 통일할 수 있게 기여했다.

역사

Node.js는 2009년 "라이언 달"에 의해 처음 공개되었다. 웹 서버들이 어떤 요청을 처리하는 동안 블로킹되는 문제를 해결하기 위해 설계되었으며, 대규모 동시 연결을 효율적으로 처리하는 것이 목표.

철학

  • Non-blocking I/O : 파일 접근이나 네트워크 통신과 같이 시간이 오래 걸리는 입출력 작업을 실행할 때 해당 작업이 완료될 때까지 메인 스레드가 대기하지 않고 즉시 다음 작업을 처리할 수 있도록 설계됨
  • 이벤트 모델 : 작업이 완료되면, 이벤트를 발생시키고 이벤트 루프가 이를 감지하여 미리 등록된 콜백 함수를 실행하는 방식으로 동시성을 관리한다.

아키텍처

V8 JavaScript 엔진

V8 엔진은 JavaScript 코드를 네이티브 머신 코드로 변환하고 실행하는 역할을 담당한다. V8은 JIT(Just-in-time) 컴파일러를 사용하여 코드를 실행 중 동적으로 최적화한다.

Event Loop

메인 스레드의 콜 스택(Call Stack)과 이벤트 큐(Event Queue)를 모니터링하며, 콜 스택이 비었을 때(메인 스레드가 유휴 상태일 때) 이벤트 큐에 있는 콜백 함수를 Call Stack으로 옮겨 실행하는 순환 구조이다. 이를 통해 I/O 작업의 완료를 기다리느라 CPU 시간을 낭비하는 것을 방지한다.

Libuv

Node.js의 비동기 I/O 작업을 처리하는 C/C++ 라이브러리 & 멀티 스레드 풀. OS 커널 기능을 활용하여 비동기 처리 및 I/O 작업을 수행한다.

I/O 처리 과정

암호화나 파일 I/O와 같은 시간이 소요되는 작업은 Node.js 의 메인 스레드가 아닌 Libuv가 관리하는 별도의 스레드 풀에서 실행된다.

  1. 메인 스레드: 비동기 I/O 작업을 Libuv로 위임.
  2. Libuv: 스레드 풀의 스레드 중 하나에 작업을 할당하고 처리.
  3. Libuv: 작업이 완료되면, 해당 작업의 콜백 함수를 이벤트 큐에 추가.
  4. 이벤트 루프: 메인 스레드가 유휴 상태일 때(Call Stack이 비었을 때), 이벤트 큐에서 콜백을 가져와 Call Stack에 넣어 실행.

모듈 시스템

  1. CommonJS (CJS) : Node.js 가 초기에 채택한 모듈 시스템. require() 함수를 사용하여 모듈을 불러오고, module.exports를 사용하여 모듈을 내보낸다.
  2. ES Module (ESM) : ECMAScript 표준에 정의된 모듈 시스템. importexport 키워드를 사용하며, 비동기 로딩 또한 가능하다. 최신 개발 환경에서 주로 사용된다.

간단한 내장 모듈

  • http : HTTP 서버 및 클라이언트를 생성 가능
  • fs : 파일 시스템 읽기/쓰기/수정/
  • path : 파일 경로 등을 다룰 수 있다.

NPM

Node.js의 표준 패키지 관리자.

자세한 설명은 NPM 문서로...

주요 활용

  • 실시간 웹 애플리케이션 : 웹소켓을 활용한 채팅, 실시간 협업, 스트리밍 등
  • API 서버 : 통신이 빈번한 백엔드 API 레이어 (Express, NestJS 등 활용)
  • 마이크로 서비스: 작고 독립적인 경량 API 게이트웨이 또는 서비스

장점

  • 언어 통합 : FE / BE 모두 JavaScript를 통한 개발 가능
  • NPM 생태계 : NPM의 규모는 매우 크다. 방대한 모듈(패키지) 지원으로 개발시간을 단축 가능하다.
  • 고성능 및 확장성 : 이벤트 루트와 논블로킹 I/O를 통해, I/O 집약적 작업에서 높은 성능을 보인다.

단점

  • CPU 집약적 작업에 약함 : 싱글 스레드 특성상, CPU 리소스를 많이 사용하는 암호화와 같은 작업에는 불리하다.
  • 콜백 지옥 : 비동기 작업이 복잡해질 경우 콜백 함수가 중첩되어 코드를 이해하기 어려워 짐. 레거시에서 많이 보인다

단 콜백 지옥의 경우, Promiseasync/await를 통해 대부분 해결된 상황

여담

  • Deno 라는 JavaScript / TypeScript 런타임도 존재한다.
  • WebAssembly (Wasm) : Node.js 환경에서 CPU 집약적 작업을 고성능으로 처리하기 위해 고려 가능한 기술

지식

자료구조
개념 & 패러다임
Frontend
Backend
블록체인 & Web3
기타

Clone this wiki locally