WIKINode.js
플레이북

Node.js

자바스크립트를 서버까지 짜게 만든 실행 환경.

Node.js런타임이벤트 루프자바스크립트백엔드 기초
런타임Java 개발자5분

한눈에

  • Node.js = 브라우저 없이 JS 돌리는 실행기 (JVM 같은 자리)
  • V8 = JS 엔진 (JVM 위치)
  • npm = Maven·Gradle (의존성 창고), package.json = pom.xml (설명서+의존성)
  • 이벤트 루프 = 종업원 한 명이 저글링 (논블로킹 = 안 기다리고 다음 일)
  • 강점 = I/O 많은 서버 / 약점 = CPU 오래 잡는 계산

자바스크립트는 원래 웹페이지 안에서만 살았다. 버튼 누르면 반응하고, 글자 바꾸고, 그런 "웹 장식용" 언어였다. Node.js는 그 자바스크립트를 브라우저 밖으로 꺼내온 실행 환경이다. 이제 내 컴퓨터나 서버에서 그냥 node script.js로 돌릴 수 있다. 장식용 언어가 "서버도 짜고 도구도 만드는" 언어로 승격한 것.

런타임이 뭔데

"런타임(runtime)"은 어떤 언어로 짠 프로그램을 실제로 돌려주는 환경이다. Java를 배웠다면 이미 아는 개념이다. Java 코드는 그냥은 안 돌고, JVM이 있어야 돈다. JVM이 바이트코드를 받아 실행해주는 것.

Node.js도 똑같은 자리다. 자바스크립트를 크롬의 V8 엔진 위에서 돌려준다. 그러니까 한 줄로 하면, "Node.js = 브라우저 없이 자바스크립트를 돌리는 JVM 같은 것"이다. 브라우저(크롬)도 사실 자바스크립트 런타임의 하나인데, Node는 화면 없이 그 실행기만 떼어낸 셈이다.

Java 하던 사람 기준 다리

낯선 게 아니라 자리만 바뀐 거다. 이미 아는 것에 대응시키면 금방 붙는다.

JVM ↔ V8 엔진 — 코드를 실제로 돌려주는 실행기
Maven·Gradle ↔ npm — 남이 만든 라이브러리(의존성)를 받아오는 도구
pom.xml·build.gradle ↔ package.json — 프로젝트 설명서 + 의존성 목록
mvn install ↔ npm install — 의존성을 실제로 내려받는 명령
Spring Boot ↔ Express·Next.js — 서버를 편하게 짜게 해주는 프레임워크

npm(Node Package Manager)은 자바스크립트 세계의 부품 창고다. npm install express 하면 남이 만든 웹 서버 라이브러리가 node_modules 폴더에 딸려온다. Maven이 .m2에 받아오는 거랑 같은 그림이다.

꼭 아는 개념 하나, 이벤트 루프(논블로킹)

Node를 이해했다고 하려면 이거 하나는 짚어야 한다. Spring과 일하는 방식이 정반대라 특히 헷갈리는 지점이다.

Spring은 보통 요청 하나에 스레드 하나를 붙인다. 손님이 100명이면 종업원 100명이 각자 붙어서, 주방에서 음식 나올 때까지 자기 손님 옆에 서서 기다린다. 자원(스레드)을 많이 쓰지만 직관적이다.

Node는 종업원이 한 명이다. 대신 이렇게 일한다. A테이블 주문을 받아 주방에 넣고 — 음식 기다리며 멈추는 게 아니라 — 바로 B테이블 주문을 받고, C테이블 물을 채우고, 그러다 주방에서 "A 음식 나왔어요" 하면 그때 A에 갖다준다. 한 명이 기다리는 시간에 다른 일을 저글링하는 것. 이 저글링을 관리하는 심장이 이벤트 루프고, "기다리며 멈추지 않는다"가 논블로킹이다.

요청 들어옴
파일 읽기·DB 조회 같은 오래 걸리는 일
백그라운드로 넘김
기다리지 않고 바로 다음 일 처리
완료되면 콜백
끝난 순서대로 결과를 돌려받음
이벤트 루프가 조율
종업원 한 명이 전부 저글링

그래서 Node는 기다림(I/O)이 많은 일에 적은 자원으로 강하다. 채팅 서버, 알림, 파일·네트워크를 많이 만지는 서버. 반대로 CPU를 오래 붙잡는 계산(무거운 이미지 처리, 복잡한 연산)엔 약하다 — 종업원이 한 명이라, 한 테이블에서 오래 걸리는 요리를 직접 하고 있으면 나머지가 다 밀린다.

우리 프로젝트에선

지금 읽고 있는 이 0to1 블로그가 Node 위에서 돈다. Next.js가 Node 런타임에서 빌드되고, 신선도 점수·글 목록을 만드는 scripts/*.mjs가 전부 Node 스크립트다. 밤마다 도는 자동화 도구들도 여기 얹혀 있다 — 자세한 건 AI 하네스에.

즉 나한테 Node는 "서버 언어"라기보다 사이트를 굴리고 자동화를 짜는 바탕으로 먼저 왔다. 프레임워크(Next.js) 밑에 깔린 실행기라, 평소엔 안 보이다가 빌드가 깨지거나 스크립트를 직접 짤 때 존재를 실감한다.

더 읽기

비유와 그림으로 더 풀어놓은 글들. 개념이 헷갈릴 때 하나씩.