노드 공식 홈페이지에서 노드를 다음과 같이 정의한다.
Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임
즉, 웹 브라우저 없이도 JavaScript 어플리케이션을 실행할 수 있다는 뜻이다. 또 노드는 웹 서버와 같이 확장성이 있는 네트워크 프로그래밍에 많이 사용된다. JavaScript는 Non-blocking I/O와 단일 스레드, 이벤트 루프 등 높은 처리 성능을 갖고 있기 때문에 노드와 JavaScript로 네트워크 프로그래밍을 하기에 적합하다.
노드의 특징들을 정리하면 아래와 같다.
런타임은 프로그램을 실핼할 수 있는 환경을 뜻한다. JavaScript 런타임(웹 브라우저, 노드 등)은 아래와 같은 특징을 갖고 있다.
JavaScript 코드는 동시에 실행될 수 없다. 즉, 동기적으로 처리한다. 코어가 여러 개 있어도 메인 스레드 위에서만 동작한다. 따라서, 하나의 heap 영역과 call stack을 갖는다.
어떻게 단일 스레드로 비동기 처리를 할 수 있을까?
JavaScript는 싱글 스레드이기 때문에 순차적으로 일을 하나보면 blocking 문제가 발생한다. 하지만 JavaScript 런타임은 다르다. 웹 브라우저나 노드는 비동기 요청을 처리할 수 있는 API를 지원한다. 이로써, 함수 호출 시 당장 실행하는 것이 아니라 콜백 함수를 받고, 이를 다른 곳에 저장해둔 뒤 요청이 완료되면 완료된 순서대로 일을 처리할 수 있다. 즉, 비동기적 처리를 할 수 있게 된다.
JavaScript 런타임에서 비동기 콜백의 프로세스를 이벤트 루프라고 한다. 많은 이벤트가 발생했을 때, 어떤 순서로 콜백 함수를 실행해야할 지를 이벤트 루프에서 관리한다. 이를 통해 비동기적인 동시성이 가능해진다.