Node.js 입문 — 브라우저 밖에서 자바스크립트가 돈다
V8 엔진을 서버에 옮긴 자바스크립트 런타임. 한 언어로 풀스택이 가능해진다.
HTML·CSS·JS 까지 익히면 자연스럽게 "이걸로 서버도 만들 수 있나?" 하는 생각이 든다. 답은 Node.js. 2009 년 처음 나왔고, 지금은 백엔드 채용 공고의 절반 가까이가 Node.js 또는 그 위의 Express/Nest 프레임워크를 요구한다.
1편은 코드보다 큰 그림. Node.js 가 정확히 무엇이고, 왜 등장했고, Python·Java 같은 기존 백엔드 언어와 무엇이 다른지, 누가 왜 쓰는지 — 2편 설치 들어가기 전 좌표부터 박는다.
1. Node.js 는 "자바스크립트 런타임" — 서버용 V8
한 줄 정리 — Node.js = V8 엔진 + libuv + 표준 라이브러리. V8 은 크롬 브라우저 안에서 자바스크립트를 빠르게 돌리는 엔진인데, 이걸 브라우저에서 꺼내 서버에서도 쓸 수 있게 한 게 Node.js 다.
"런타임" 이라는 단어가 익숙하지 않으면 이렇게 보면 된다 — 자바스크립트 코드가 실제로 굴러가는 환경. 브라우저는 자바스크립트 + DOM + window 객체로 구성된 런타임이고, Node.js 는 자바스크립트 + 파일 시스템 + 네트워크 + 프로세스 객체로 구성된 런타임이다. 같은 언어, 다른 무대.
node script.js 처럼 명령어도 그냥 node. ".js" 는 자바스크립트 파일이라는 의미가 아니라 그저 프로젝트 이름의 일부.
2. 왜 등장했나 — 비동기 I/O 한 가지 답
2009 년 Ryan Dahl 이라는 개발자가 풀던 문제는 "왜 웹 서버가 파일 한 번 읽을 때마다 스레드가 통째로 멈춰 있어야 하나". 당시 PHP·Java·Python 서버들은 요청이 오면 스레드 하나를 잡고, DB 응답을 기다리는 동안 그 스레드가 다른 일을 못 했다. 1만 명 동시 접속 = 1만 개 스레드 = 메모리 폭발.
Node.js 의 답은 이벤트 루프 + 논블로킹 I/O. 하나의 스레드가 "DB 야 응답 오면 알려줘" 등록만 해두고, 그 사이에 다른 요청을 처리한다. 응답이 도착하면 이벤트 큐로 들어오고 다시 처리. 결과적으로 적은 메모리로 많은 동시 접속을 받는다.
자바스크립트가 채택된 이유도 이 설계와 맞물린다 — 자바스크립트는 처음부터 단일 스레드 + 콜백 기반으로 설계됐다. 브라우저에서 "버튼 클릭하면 이걸 해라" 식. 이 모델이 서버 비동기 I/O 와 자연스럽게 맞아떨어졌다.
3. Python·Java 와 무엇이 다른가
"백엔드 = Python 아니에요?" 라고 묻는 사람한테 가장 쉬운 비교.
| 구분 | Node.js | Python | Java |
|---|---|---|---|
| 언어 | JavaScript / TypeScript | Python | Java / Kotlin |
| 주요 강점 | 실시간·I/O 중심·풀스택 | 데이터·AI·스크립트 | 대규모 엔터프라이즈 |
| 동시성 모델 | 이벤트 루프 (1 스레드) | GIL · 스레드/asyncio | 멀티스레드 (JVM) |
| 패키지 | npm (260만+) | pip (50만+) | Maven (수십만) |
| 학습 곡선 | JS 안다면 낮음 | 매우 낮음 | 높음 |
| 잘 어울리는 일 | REST API · WebSocket · BFF | 머신러닝 · 크롤러 · 자동화 | 은행 · 결제 · 트래픽 큰 시스템 |
핵심 차이는 두 가지 — 같은 언어로 프론트와 백을 묶을 수 있다 (한 팀이 둘 다 본다), 그리고 I/O 가 많은 일에 강하다 (실시간 채팅·알림·API 게이트웨이). 대신 CPU 가 빡센 일 (이미지 변환·머신러닝 추론) 은 Python 이나 Go 가 낫다.
4. 왜 쓰나 — 4가지 무기
① 풀스택을 한 언어로
프론트 React/Next.js + 백 Node.js/Express. 같은 자바스크립트라 타입·유틸 함수·검증 로직을 공유할 수 있다. 작은 팀일수록 이득.
② npm — 거대한 패키지 생태계
등록된 패키지 260 만 개 이상. 인증·결제·이미지·메일·DB 클라이언트 — 거의 모든 것에 라이브러리가 있다. npm install 한 줄로 끝.
③ 비동기 I/O 가 기본
요청이 폭주해도 적은 메모리로 버틴다. 채팅·실시간 알림·API 프록시 같은 I/O 중심 서비스에 강하다. Discord·Netflix·Uber·LinkedIn 이 핵심 부분에 Node 를 쓴다.
④ 서버리스·엣지 친화
Vercel·Cloudflare Workers·AWS Lambda 같은 서버리스 환경의 1순위 런타임. 콜드 스타트가 빠르고 메모리 사용량이 작아 함수 단위 배포에 잘 맞는다.
5. 첫 코드 — Hello Node
2편에서 설치하지만 미리 어떤 모양인지 본다. hello.js 파일 하나 만들고:
터미널에서 실행:
딱 자바스크립트인데, 브라우저엔 없던 process 객체가 있다. process.version·process.cwd()·process.env 같은 게 Node 가 추가한 것. 파일 읽기, 네트워크, OS 정보 — 브라우저가 막아 둔 모든 게 여기선 열려 있다.
요약 — Node.js 좌표
여기까지 핵심을 한 번 더. Node.js 는 V8 엔진을 서버에 옮긴 자바스크립트 런타임이다. 이벤트 루프 + 논블로킹 I/O 로 적은 메모리로 많은 동시 접속을 받고, npm 260 만 패키지로 거의 모든 일을 끌어다 쓸 수 있다. 풀스택 한 언어·실시간·서버리스에 강하고, CPU 무거운 계산은 약하다. 2편에서 nvm 으로 Node 를 설치하고 버전 관리하는 법을 배운다.
다음 편 예고 — nvm 으로 Node.js 설치하기
맥·우분투·윈도우 환경에서 nvm 으로 여러 Node 버전을 깔끔하게 관리하는 법.