Node.js 소개
Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.
위 문장은 Node.js의 공식 웹사이트의 메인 페이지에 적혀있는 Node.js에 대한 소개 문장입니다. 공식 웹사이트에 사용된 문장인 만큼 이는 Node.js의 특징을 가장 잘 나타낸 말이라고 할 수 있겠죠.
위 문장에서 보듯이 Node.js는 단순히 웹서버 개발의 용도로만 사용되지는 않습니다. 이미 네이티브 앱 개발, 프론트엔드 개발, 커맨드라인 명령어 프로그램 개발 등, 다양한 분야에서 사용되고 있으며, JavaScript를 웹 브라우저라는 제약에서 벗어나 범용 스크립트 언어로 만들어 준 장본인 이라고 할 수 있습니다.
Node.js 특징
- V8 JS Engine
- Event-driven
- 비동기 non-blocking IO
V8 JavaScript Engine
노드는 자바스크립트 런타임 환경입니다. 런타임 환경이라는 말은 특정 언어로 작성된 프로그램을 실행시킬 수 있는 환경을 뜻합니다. 즉 Node.js는 자바스크립트를 웹브라우저 환경이 아닌 다른 곳에서도 실행할 수 있도록 만들어주는 프로그램이라고 할 수 있습니다.
Node.js는 구글이 개발한 JavaScript V8 엔진을 자바스크립트 엔진으로 사용합니다. V8 엔진은 내부적으로 C언어로 구현되었으며, JIT(Just In Time) 컴파일 방식을 사용해 속도가 매우 빠릅니다. 이 V8엔진은 크롬 웹브라우저의 자바스크립트 엔진이기도 합니다.
Event Driven
노드는 이벤트 기반 비동기 I/O 모델을 기반으로 동작합니다.
이벤트 기반이란 네트워크 요청이나 사용자 입력등과 같은 특정 이벤트가 발생할 때 이러한 이벤트를 감지할 수 있는 이벤트 리스너를 이용해 등록해둔 특정 작업을 수행하도록 하는 방식입니다.
이러한 이벤트 기반 시스템을 위해 노드는 주로 이벤트 리스너에 콜백함수를 등록하는 방식으로 구현됩니다. 예를 들어, 클릭 이벤트와 같은 이벤트가 발생할 경우, 이벤트 리스너에 미리 등록해놓은 콜백함수가 호출되어 사용자 클릭 이벤트에 반응하는 방식입니다.
비동기 Non-blocking I/O
논블로킹 입출력은 작업 시간이 오래 걸리는 작업을 백그라운드 프로세스에서 처리한 뒤, 그 결과를 돌려 받는 방식으로 작업을 처리하는 방식을 의미합니다.
블로킹 방식은 여러개의 작업이 있을 경우, 하나의 작업을 끝낸 후에야 다음 작업으로 순차적으로 넘어가는 방식을 말합니다. 하지만 논 블로킹 방식은 작업을 순차적으로 처리하지 않고, 다른 프로세스에게 시간이 오래 걸리는 작업을 처리를 위임한 후, 곧바로 다른 작업을 처리하는 방식입니다. 그리고 다른 프로세스가 작업이 안료되었을 경우, 처리 결과를 돌려 받아 추가 작업을 처리합니다.
이러한 방식의 구현을 위해 Node.js는 콜백함수를 많이 사용하게 되며, 흔히들 콜백지옥이라 부르는 문제점에 봉착하기도 합니다. 하지만 최근에는 Promise와 Async / Await 문법으로 이러한 콜백 문제가 상당히 극복되었습니다. (자세한 예시는 추후 코드를 보며 진행해 나가겠습니다.)
Node.js는 이러한 비동기 논블로킹 입출력 처리를 위해 libuv 라이브러리를 개발하여 사용하고 있으며, 노드의 코어 라이브러리는 V8 엔진과 libuv 라이브러리 기반 위에 구현되어 있습니다.