"Node 는 언어가 아냐. JavaScript 가 브라우저 밖으로 나가도 된다고 결정한 *런타임* 이야."
다들 헷갈리는 그 문장
개발자 열 명한테 "Node.js 가 뭐예요?" 물어봐. 아홉 명은 헷갈린 답을 줘. "서버에서 도는 JavaScript요." "Python 비슷한 건데 웹용?" "내 dev server 가 돌아가는 그거." 다 맞는데 아무도 완전하지 않아.
정확한 한 문장은 이거야: Node.js 는 구글의 V8 자바스크립트 엔진에 libuv 라는 C 라이브러리를 붙여서 non-blocking I/O 를 가능하게 하고, 표준 라이브러리를 얹어서 자바스크립트가 브라우저에선 절대 못 하던 일 — 파일 읽기, 소켓 열기, 프로세스 띄우기, OS 와 직접 대화 — 을 하게 해주는 *런타임* 이야.
두 번 읽어. 단어 하나하나 다 중요해. V8 만 있으면 그냥 엔진이야 — JavaScript 파싱하고 실행은 하지만 파일이나 소켓 따위 몰라. libuv 만 있으면 그냥 C 라이브러리야 — 빠르고 async 한데 JavaScript 가 없어. Node 는 결혼이야: V8 + libuv + 잘 골라낸 표준 라이브러리 + node 라는 CLI 바이너리.
2009 년엔 왜 안 당연했지
2009 년에 Ryan Dahl 이 Node 발표했을 때, 통념은 "JavaScript 는 브라우저 안에서만 산다" 였어. 끝. 서버 사이드 JS 는 시도된 적 있었지 (Netscape 의 LiveWire, JVM 위의 Rhino) — 다 망했어. Dahl 의 통찰은 "서버에서 JS" 가 아니라 (그건 옛날 얘기) — 진짜 통찰은 이거였어: JavaScript 는 이미 브라우저에서 single-threaded event-driven 사고방식을 가지고 있어. 거기에 빠른 async I/O 라이브러리를 붙이면, 만 개 connection 을 만 개 thread 없이 처리하는 서버가 나와.
그 베팅 통했어. 2015 년 npm 은 지구에서 제일 큰 패키지 레지스트리가 됐어. 2020 년엔 메이저 번들러 / dev tool 다 Node 기반이었지. 지금은 Vite dev server, Next.js build, Vitest, `npm install` 어느 하나 못 돌려 Node 가 밑에 안 깔리면. 런타임이 이긴 거야.
런타임 ≠ 언어
fs, 브라우저엔 window, 순수 JS spec 에는 둘 다 없음).이 quest 가 가정하는 거 (그리고 안 가정하는 거)
이 quest 는 네가 JavaScript 읽을 수 있다고 가정해. const, arrow function, destructuring, spread, async/await 문법 — 익숙하면 OK. JavaScript 자체를 가르치진 않아; 우리는 *그 밑의 런타임* 을 가르쳐. JS 자체가 새거면 MDN 의 JS guide 한 번 훑고 와.
이 quest 가 안 가정하는 거: V8 문서 한 번이라도 열어봤다거나, libuv 가 뭔지 안다거나, event loop 의 6 단계를 댈 수 있다거나. Track 1 끝날 즈음엔 셋 다 냅킨에 그릴 수 있게 돼.