What is Node.js?

류예린·2022년 7월 25일
0

1. What is Node.js and Why Use it?


What is Node.js?

Node.js는 Chrome 브라우저의 V8 Javascript 엔진을 탑재한 Server Side 오픈소스 Javascript 런타임이다. Node.js가 무엇인지 이해하기 위해서는 JavascriptChrome V8 엔진Server SideRuntime 이 네가지 키워드에 대해서 먼저 알아야 한다. 물론 더 깊이 이해하기 위해서는 단일 스레드, 논 블로킹 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를 구축 및 실행할 수 있다.

Why Use it?

Node.js는 주로 API 서버(HTTP 서버)를 구축하는데 활용된다. Node.js 기반의 API 서버가 갖는 장점이 있다.

✔️ Frontend와 Backend 기술 스택 통합

  • 프론트엔드와 백엔드 양쪽에 동일한 언어를 사용하면 코드를 모듈로 만들어서 재사용할 수 있다.
  • Javascript로 훈련된 개발자는 최소한의 노력으로 서버 측 프로그래밍을 시작할 수 있다.
  • 현대 웹 개발에서 가장 중요한 개발팀의 전반적인 생산성 향상에 도움이 됩니다.

✔️ 빠른 처리 속도와 동시 요청 처리 성능

  • Node.js에 사용된 C++로 작성된 V8 엔진은 인터프리터 방식이 아닌 JavaScript로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 JIT 컴파일 방식을 채택하고 있으며, V8의 최적화 기법으로 놀라운 속도로 작업을 수행한다. Google이 엔진에 막대한 투자를 한 덕분에 V8은 매년 성능 향상을 보여주고 있다.
  • Node.js에는 V8 엔진과 더불어 libuv라는 비동기 I/O에 중점을 둔 오픈 소스 라이브러리를 사용함으로써 이벤트 기반(Event Driven), Single Thread, non-blocking I/O 모델을 구현한다. 덕분에 Node.js는 지연(blocking) 없이 동시 요청을 빠르게 처리할 수 있다.

✔️ MSA (Micro Service Architecture)에 적합

[그림 1-1] Micro Service Architecture (MSA)

  • 이러한 MSA는 요즘 널리 사용되는 아키텍처다. MSA 구조 안에서는 기능이 추가될 때마다 기존 시스템에 더해지는 것이 아니라 가벼운 시스템을 새롭게 구축하는 방법으로 확장하게 된다. 결과적으로 Node.js는 상대적으로 가벼운 런타임이기 때문에 MSA와 아주 잘 조화되어 사용될 수 있다.
  • 위에서 설명한 장점 이외에도 node.js는 풍부한 생태계(라이브러리 약 80만개)를 갖고 있고, JSON 형식을 그대로 사용할 수 있는 등 많은 장점들이 있다. Node.js의 경우 속도와 확장성을 요구하는 집중적인 I/O가 있는 실시간 애플리케이션, 웹, 앱 어플리케이션 개발에 적합한 기술이다. 최근 Node.js는 엔터프라이즈급(Netflix, NASA, 페이팔 등)에서 Node.js를 채택해서 활발히 사용되고 있다.




2. Running Javascript Outside the Browser


REPL (Read Eval Print Loop)

Node.js REPL(Read-Eval-Print-Loop)은 Javascript 코드 및 node.js에서 제공하는 다양한 표현식을 실시간으로 처리하는 대화형 쉘(Shell)을 의미한다. 이 대화형 쉘은 사용자가 입력한 Javascript 코드를 읽고, 코드 행을 해석한 결과를 평가하고, 결과를 사용자에게 출력하고, 사용자가 종료 신호를 보낼 때까지 이 과정을 반복한다. 말하자면 REPL은 파일을 생성하지 않고도 Javascript 코드를 테스트하는 빠른 방법이다.

✔️ (Step 1) Starting and Stopping the REPL

이미 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)로 돌아갈 수 있습니다.

✔️ (Step 2) Executing Code in the Node.js REPL

$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에서 실행할 수 있다.

Javascript file 실행

브라우저 밖에서 Node.js 런타임에서 자바스크립트 코드를 실행시킬 수 있는 방법은 크게 두 가지가 있다. 첫 번째 방법은 위에서 설명한 REPL을 사용하는 방법이고, 두 번째 방법은 .js라는 확장자를 가진 파일을 생성한 후에 편집기(vscode, vim)를 사용해서 .js 파일 내에 코드를 작성한 후에 파일에 적힌 코드를 실행시키는 방법이다.

✔️ (Step 1) Creating javascript file

js 파일을 생성.

# test.js 파일 생성
$ touch hello.jsl

# test.js 생성 여부 확인
$ ls
.rw-r--r-- 0 .. hello.js

편집기를 사용해서 test.js을 열고, 아래 코드를 작성한 후에 저장.

// hello.js
console.log("Hello World");

✔️ (Step 2) Running the program

Node.js는 파일을 읽고 console.log("Hello World"); 전역 콘솔 개체의 log 메서드를 호출하여 문자열 "Hello World"가 출력된다.

$node hello.js
Hello World




3. 정리


  • Node.js는 Chrome 브라우저의 V8 Javascript 엔진을 탑재한 Server Side 오픈소스 Javascript 런타임이다.
  • Node.js는 주로 이벤트 기반의 높은 처리 성능을 낼 수 있는 네트워크 서버(API)를 구축하는데 활용된다.
  • Node.js 기반의 네트워크 서버(API)의 장점은 Frontend와 Backend 기술 스택 통합, 빠른 처리 속도와 높은 동시 요청 처리 성능, 그리고 MSA (Micro Service Architecture)에 적합 등이 있다.
  • NVM (Node Version Manager)를 사용해서 node.js의 버전을 관리할 수 있다.
  • javascript 코드를 실행하는 방법은 REPL (Read Eval Print Loop)과 .js 파일에 코드를 작성하고 실행하는 방법이 있다.
profile
helloworld

0개의 댓글