Node.js 소개 — 브라우저 밖의 자바스크립트
Node.js 소개 — 브라우저 밖의 자바스크립트
브라우저에서만 돌던 자바스크립트가 서버에서도 돌 수 있다면 어떨까요? 그걸 가능하게 만든 것이 Node.js예요. Node.js는 오픈소스·크로스 플랫폼의 자바스크립트 런타임 환경으로, 거의 모든 종류의 프로젝트에서 널리 쓰이는 도구예요.
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:http의 createServer()로 간단한 서버를 만들 수 있어요.
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가 정확히 어떻게 동작하는지 더 알고 싶다면 공식 문서를, 설치가 필요하다면 다운로드 페이지를 참고하면 돼요.