Node.js는 Chrome 브라우저의 V8 Javascript 엔진을 탑재한 Server Side 오픈소스 Javascript 런타임이다. Node.js가 무엇인지 이해하기 위해서는 Javascript
, Chrome V8 엔진
, Server Side
, Runtime
이 네가지 키워드에 대해서 먼저 알아야 한다. 물론 더 깊이 이해하기 위해서는 단일 스레드, 논 블로킹 I/O, 이벤트 기반 리액터 패턴과 같은 개념이 필요하다.
Javascript
는 브라우저(Chrome, Safari, Internet Exploere)에서 HTML 요소 생성부터 모든 페이지 및 기능을 동적으로 처리할 수 있도록 만들어주는 브라우저에서 실행되는 프로그래밍 언어다. 2005년, 구글이 발표한 Google Maps는 웹에서 Javascript의 가능성을 보여줬고, javascript로 웹 서비스를 개발하려는 시도가 점점 늘어났다.이렇게 Javascript가 웹을 장악하면서 브라우저에서 Javascript를 더욱 빠르게 실행시킬 수 있는 엔진이 필요해 졌다.
2008년, Google이 주도하여 C++로 개발한 고성능의 V8 Javascript 엔진
이 등장했다. V8 엔진은 J avascript 언어로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 역할을 수행한다. 바이트 코드는 직접 CPU 내의 레지스터와 누산기를 어떤 식으로 사용하라고 명령하는 명령문이나 마찬가지기 때문에 사람 입장에서는 어렵지만 컴퓨터 입장에서는 한결 이해하기가 편한 방식이다. 이렇게 속도까지 얻게 된 Javascript는 생태계가 더욱 커지게 되면서, Browser에서만 실행 가능한 Javascript를 웹 브라우저가 아닌 곳에서도 실행 가능하도록 하는 움직임이 생겼다.
2009년 11월, 당시 Joyent의 라이언 달(Ryan Dahl)이라는 미국 소프트웨어 공학자가 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를 브라우저 이외의 환경에서도 동작할 수 있도록 V8 엔진을 브라우저에서 독립시킨 Javascript의 또 다른 실행 환경(runtime)
인 Node.js를 발표했다. 그러면서, 브라우저에서 할 수 없는 운영체제의 파일 시스템에 접근해서 파일을 조작하는 등 다양한 일들이 가능하게 됐다. 단순히 Javascript를 Browser 밖에서 사용할 수 있는 것 외에도, 2010년 Google Tech Talk 내용을 보면, 라이언 달이 Node.js를 개발함에 있어 중요하게 생각했던 것은 Network Server를 만드는 것이었음을 알 수 있다.
특히 당시 가장 인기 있는 웹 서버인 Apache HTTP Server가 최대 10,000개 이상의 동시 요청을 다루는데 있어서 갖는 문제를 해결하고자, 자바스크립트(Javascript)를 그대로 활용하면서, 이벤트 기반의 높은 처리 성능을 낼 수 있는 network 서버를 만드는 것에 관심이 있었고 그렇게 Node.js가 탄생한다. Node.js는 페이팔, 넷플릭스, 월마트, 링크드인, 우버 등에서 메인 또는 서브 백엔드 서버를 만드는데 사용되고 있다.
정리하면, Node.js는 Chrome 브라우저의 V8 Javascript 엔진을 탑재한 이벤트 기반의 Server Side 오픈소스 Javascript 런타임으로, 노드에 내장되어 있는 기능들(libuv, httpd, ..)로 동시 요청 처리에 높은 성능을 갖는 HTTP Server를 구축 및 실행할 수 있다.
Node.js는 주로 API 서버(HTTP 서버)를 구축하는데 활용된다. Node.js 기반의 API 서버가 갖는 장점이 있다.
V8 엔진
은 인터프리터 방식이 아닌 JavaScript로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 JIT 컴파일 방식을 채택하고 있으며, V8의 최적화 기법으로 놀라운 속도로 작업을 수행한다. Google이 엔진에 막대한 투자를 한 덕분에 V8은 매년 성능 향상을 보여주고 있다.libuv
라는 비동기 I/O에 중점을 둔 오픈 소스 라이브러리를 사용함으로써 이벤트 기반(Event Driven), Single Thread, non-blocking I/O 모델을 구현한다. 덕분에 Node.js는 지연(blocking) 없이 동시 요청을 빠르게 처리할 수 있다.[그림 1-1] Micro Service Architecture (MSA)
Node.js REPL(Read-Eval-Print-Loop)은 Javascript 코드 및 node.js에서 제공하는 다양한 표현식을 실시간으로 처리하는 대화형 쉘(Shell)을 의미한다. 이 대화형 쉘은 사용자가 입력한 Javascript 코드를 읽고, 코드 행을 해석한 결과를 평가하고, 결과를 사용자에게 출력하고, 사용자가 종료 신호를 보낼 때까지 이 과정을 반복한다. 말하자면 REPL은 파일을 생성하지 않고도 Javascript 코드를 테스트하는 빠른 방법이다.
이미 node.js가 설치되어 있는 상황이라면, Node.js REPL 역시 설치되어 있다. REPL을 시작하는 방법은 간단하게 터미널에 node를 입력한다. > 기호는 이제 사용자가 입력하는 Javascript 코드는 즉시 평가해서 실행시켜준다는 의미다.
$node
Welcome to Node.js v16.3.0.
Type ".help" for more information.
>
REPL을 종료하려면 .exit
을 입력하거나 CTRL + D
를 한 번 누르거나 CTRL + C
를 두 번 눌러서 기본 쉘 프롬프트(zsh, bash)로 돌아갈 수 있습니다.
$node
Welcome to Node.js v16.3.0.
Type ".help" for more information.
>
REPL은 숫자와 문자열에 대한 작업을 처리할 수 있다.
> 12 / 2
6
> "Hello " + "World"
'Hello World'
javascript로 개발할 때 자주 사용하는 메세지를 출력하는 함수인 console.log()
혹은 다른 함수를 실행시킬 수 있다.
> console.log("Hi")
Hi
undefined
첫 번째 결과는 stdout 스트림(화면)에 메시지를 인쇄하는 console.log의 출력이다. console.log는 문자열을 반환하는 대신 문자열을 인쇄하기 때문에 메시지는 따옴표 없이 표시된다. 두 번째 결과인 undefined는 console.log()의 반환 값이다. 위에서 설명한 내용 외에도 변수를 만들어서 사용하는 등 거의 모든 유효한 JavaScript 또는 Node.js 표현식을 REPL에서 실행할 수 있다.
브라우저 밖에서 Node.js 런타임에서 자바스크립트 코드를 실행시킬 수 있는 방법은 크게 두 가지가 있다. 첫 번째 방법은 위에서 설명한 REPL을 사용하는 방법이고, 두 번째 방법은 .js라는 확장자를 가진 파일을 생성한 후에 편집기(vscode, vim)를 사용해서 .js 파일 내에 코드를 작성한 후에 파일에 적힌 코드를 실행시키는 방법이다.
js 파일을 생성.
# test.js 파일 생성
$ touch hello.jsl
# test.js 생성 여부 확인
$ ls
.rw-r--r-- 0 .. hello.js
편집기를 사용해서 test.js을 열고, 아래 코드를 작성한 후에 저장.
// hello.js
console.log("Hello World");
Node.js는 파일을 읽고 console.log("Hello World"); 전역 콘솔 개체의 log 메서드를 호출하여 문자열 "Hello World"가 출력된다.
$node hello.js
Hello World