Node.js 소개 — 브라우저 밖의 자바스크립트

Node.js 소개 — 브라우저 밖의 자바스크립트

브라우저에서만 돌던 자바스크립트가 서버에서도 돌 수 있다면 어떨까요? 그걸 가능하게 만든 것이 Node.js예요. Node.js는 오픈소스·크로스 플랫폼의 자바스크립트 런타임 환경으로, 거의 모든 종류의 프로젝트에서 널리 쓰이는 도구예요.

출처: Introduction to Node.js | Node.js Learn

V8 엔진과 단일 프로세스

Node.js는 Google Chrome의 핵심인 V8 자바스크립트 엔진을 브라우저 밖에서 실행해요. 그래서 성능이 아주 뛰어나요. 그리고 Node.js 앱은 요청마다 새 스레드를 만들지 않고 단일 프로세스로 돌아요.

Node.js 표준 라이브러리는 비동기 I/O 프리미티브를 갖춰서 자바스크립트 코드가 블로킹되는 것을 막아 줘요. Node.js 라이브러리들은 대체로 논블로킹 패러다임으로 작성되어서, Node.js에서는 블로킹 동작이 예외에 가까워요.

비동기 I/O 방식

Node.js가 I/O 작업(네트워크 읽기, 데이터베이스 접근, 파일 시스템)을 수행할 때, 스레드를 블록하고 CPU 사이클을 낭비하며 기다리는 대신, 응답이 돌아오면 그때 작업을 재개해요.

이 방식 덕분에 Node.js는 스레드 동시성 관리라는 큰 버그 원천을 떠안지 않고, 단일 서버로 수천 개의 동시 연결을 처리할 수 있어요.

프론트엔드 개발자의 강점

Node.js의 독특한 장점 중 하나는, 브라우저에서 자바스크립트를 쓰던 수백만 프론트엔드 개발자가 완전히 다른 언어를 배울 필요 없이 서버 사이드 코드까지 쓸 수 있다는 점이에요. 클라이언트 코드와 서버 코드를 같은 언어로 작성하는 거죠.

또한 Node.js에서는 사용자가 브라우저를 업데이트하기를 기다릴 필요가 없어서, 새로운 ECMAScript 표준을 문제없이 쓸 수 있어요. Node.js 버전을 바꿔 어떤 ECMAScript 버전을 쓸지 직접 결정하고, 플래그로 특정 실험 기능을 켤 수도 있어요.

Hello World 웹 서버

Node.js의 가장 대표적인 예는 웹 서버예요. node:httpcreateServer()로 간단한 서버를 만들 수 있어요.

const { createServer } = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

이 코드를 server.js로 저장하고 node server.js로 실행하면, http://127.0.0.1:3000/에서 "Hello World"를 응답하는 서버가 떠요. 이 코드는 먼저 Node.js http 모듈을 포함하고, createServer() 메서드가 새 HTTP 서버를 만들어 돌려줘요. 서버는 지정한 포트와 호스트에 리슨하고, 준비되면 콜백이 호출돼요.

새 요청이 올 때마다 request 이벤트가 호출되며 두 객체를 건네줘요 — 요청(http.IncomingMessage) 객체와 응답(http.ServerResponse) 객체예요. 첫 번째는 요청 상세(헤더, 데이터)를 제공하고, 두 번째는 호출자에게 데이터를 돌려주는 데 써요.

Node.js에는 네트워킹을 일급으로 지원하는 훌륭한 표준 라이브러리가 있어요. Node.js가 정확히 어떻게 동작하는지 더 알고 싶다면 공식 문서를, 설치가 필요하다면 다운로드 페이지를 참고하면 돼요.

더 알아보기