node.js, nvm, npm이란 무엇인가

2020. 1. 24. 15:32Programming/JavaScript

node.js, nvm, npm이란 무엇인가

contents

  1. node.js란 무엇인가
    1. 자바스크립트란?
    2. 자바스크립트 엔진?
    3. 자바스크립트 런타임?
  2. npm이란 무엇인가
  3. nvm이란 무엇인가

웹을 공부하면서 node나 npm을 사용하면서도 정작 node.js는 무엇인지 nvm, npm이 무엇인지에 대해서는 깊게 생각하지 않았던 것 같다. 그래서, 한번 정리해보는 시간을 갖도록 해보기로 했다.

📍 1. node.js란 무엇인가?

위키백과 : Node.js는 확장성 있는 네트워크 애플리케이션 개발에 사용되는 소프트웨어 플랫폼이다.
org : Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.

??? 이게 바로 무슨소리일까. V8이 무엇일까..

V8은 C ++로 작성된 Google의 오픈 소스 고성능 JavaScript 및 WebAssembly 엔진입니다. Chrome 및 Node.js에서 사용됩니다. ECMAScript 및 WebAssembly를 구현한다.

자 쉽게 가자.

자바스크립트 엔진(JavaScript engine)

위에서 엔진이란, 특히나 자바스크립트 엔진은 자바스크립트 코드를 실행하는 프로그램/인터프리터라고 했다.

자바스크립트 엔진이 여러 목적으로 사용되고, 가장 대표적으로는 크롬같은 웹 브라우저, Node.js 같은 실행 환경에서 사용되고있다.

자바스크립트 인터프리터로 자바스크립트 엔진은 파싱, JIT컴파일(just-in-time compilation)프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법)을 하는 머신을 제공해야한다.

그 뜻은 자바스크립로 쓰여진 스크립트가 실행이 가능하다는 것인데, 이를 가능케 하는 것이 엔진, 크롬에서는 Google V8 엔진이 있다.

자바스크립트 런타임(JavaScript Runtime)

만약 컴퓨터에서 프로그램이 가동된다면, 그 컴퓨터가 그 프로그램의 런타임이다. 즉, 실행되는동안 사용가능한 환경을 말한다. 그러면 그 과정에서 필요한 것들(라이브러리들 등)이 있을 것이다. 어떠한 프로그램이 실행될 떄 런타임에 연결되어 해당 프로그램을 사용할 수 있게 한다.

자바스크립트 런타임환경은 프로그램이 실행되는 동안 사용가능한 내장된 라이브러리를 제공해야한다.

위에서 설명한 실행환경 두가지 Chrome, Node.js를 예로들어보자.

  • Chrome런타임은 브라우저에서 윈도우 오브젝트나 DOM API를 사용하고자 한다면 이 과정에 브라우저의 JavaScript 런타임 환경이 포함되어야하고 실제로 포함되어있다. 그래야 윈도우 오브젝트나 DOM API를 사용할 수 있기 때문이다.
  • Node.js런타임은 Cluster, FileSystem API같은 다른 라이브러리들을 모두 포함하고있다.

두 런타임(Runtime)모두 내장된 데이터 타입들과 Console object같은 공통된 기능들을 포함하고있다.

정리해보면, Chrome과 Node.js는 같은 Google의 V8엔진을 사용하지만 다른 런타임(runtime)환경, 즉 Chrome과 Node.js라는 다른 실행 환경을 가지고 있다.

그러면 본격적으로!!

Node.js란 무엇인가?

JavaScript를 크롬같은 브라우저에서가 아닌, 브라우저 밖에서! 로컬 컴퓨터에서 다양한 용도로 확장하기 위해 만들어 진 것이 바로 Node.js이다. Node.js를 통해 JavaScript언어를 사용하여 내 컴퓨터에서 file system, server만들기 등을 할 수 있다.

Node.js를 써서 Express 같은 라이브러리를 이용해 서버를 만들곤 하지만, Node.js자체는 웹서버가 아니다!! Node.js는 자바스크립트 런타임이며, 웹서버를 만들 수 있는 하나의 방법인 것이다.

Node.js의 특징

  • 비동기 I/O의 처리 : Node.js 라이브러리의 모든 API는 비동기식이다(async). 곧, sync(동기)모델들은 특정 라인의 코드가 실행되기위해 그 전까지의 코드연산이 다 끝날때까지 기다려야하지만, 비동기식은 멈추지 않는다(Non-Blocking). Node.js기반의 서버는 api가 실행되었을 때, 데이터를 반환할 때 까지 기다리지 않고 다음 api를 실행한다. 그리고 이전에 실행했던 api가 결과값을 반환했을 경우, node.js의 이벤트 알림 매커니즘을 통해 결과값을 받아온다.
  • 빠른 속도 : 구글 크롬의 V8 자바스크립트 엔진을 사용하여 빠른 코드 실행을 제공한다.
  • 단일 쓰레드와 뛰어난 확장성 : Node.js는 위에서 비동기처리(논블락킹)이라고했으므로 단일 쓰레드 모델(Thread 1개!!)을 사용하며, 이벤트 루프를 함께 사용한다. 이벤트 메커니즘은 서버가 멈추지 않고 반응하도록 해 서버의 확장성을 키워준다. (사실상 클라이언트(웹에서는 웹클라)가 내부적으로 멀티쓰레드 작업을 하지만, nodejs 요청들이 모두 같은 하나의!스레드에서 실행된다.) 이것이 특징이 되는 이유는, 사실 일반적인 웹서버(Apache 등)들은 요청을 처리하기 위해 제한된 쓰레드를 생성한다. 그래서 Node.js를 사용하면 훨씬 더 많은 요청을 처리할 수 있다.
  • 버퍼링이 없다 : Node.js 어플리케이션에는 데이터 버퍼링이 없고, 데이터를 chunk 단위로 출력한다.
  • 라이센스 : Node.js는 MIT License(오픈소스 라이센스)가 적용되어있다.
  • V8엔진
    • 빠른 프로퍼티 접근 : 대부분의 JavaScript 엔진이 프로퍼티를 저장하기 위해 dictionaty-like data structure(Hashing)를 사용하지만, V8(자바스크립트엔진)은 hidden class(를 생성 후 → 프로퍼티의 정적위치인offset을 저장하여 실제 데이터가 저장되어있는 주소를가리키는 Pointer을 제공) 를 사용한다. 객체에 새로운 프로퍼티를 추가할 때 마다 새로운 hidden class를 생성하는 방식은 상당히 비효율적이지만, 다음번에 같은 객체를 생성할 떄 이전에 생성했던 hidden class를 재사용 함으로써 객체 생성 비용을 줄일 수 있다.
    • 효율적인 가비지 콜렉션 : 가비지 컬렉션 사이클을 수행할 때 프로그램 실행을 멈추어, 객체의 heap영역(메모리 구조의)만 처리함으로써 프로그램이 멈추는 영향을 최소화한다. 또한 객체와 포인터가 어디에 위치해있는지 정확하게 관리하여 메모리 누수를 피한다.

Node.js의 사용

특히나 Node.js의 비동기(non-blocking, async), 단일쓰레드, 뛰어난 확장성, 데이터 버퍼링이없는 특징은

  • 알림이나 실시간 대화같이 데이터의 실시간 처리가 필요한 어플리케이션
  • 사용자의 입력과 출력이 잦은 애플리케이션
  • 데이터 스트리밍 애플리케이션
  • JSON API기반의 애플리케이션
  • 단일 페이지 기반의 애플리케이션

의 애플리케이션을 개발할 경우 특히나 좋은 효율성을 발휘한다.

그래서 실제로 위의 서비스를 제공하는 다양한 회사들에서 사용하고있따. 넷플릭스, 우버같은 실시간 처리가 중요한 애플리케이션이나, 많은 데이터 입출력이 있는 페이팔, 이베이 같은 곳에서도 사용한다.

하지만, Data Science같이 복잡한 데이터를 처리하기위하여 하드웨어를 사용하는 곳에는 적합하지 않다. 하드코어한 처리를 목적으로 하는곳에는 Python, Django 등이 더 적합하다.

 

📍 2. Npm

그래서, Node를 이해했으니, 그와 관련된 npm을 알아보자.

npm이란?

Node Package Manager으로, 자바스크립트를 위한 패키지 관리자이다. 자바스크립트 런타임 환경의 Node.js의 그 Node가 맞다.

npm은 세계 최대의 소프트웨어 창고로, 엄청난 수의 코드 패키지를 가지고있다. 이는 오픈소스 개발자들이 그들이 개발한 소프트웨어를 공유한다. 누구든지 패키지를 import 하여 사용할 수 있고, 내가 만든 소프트웨어를 퍼블리싱할 수도 있다.

npm의 사용 : CLI

npm은 우리가 라이브러리등을 다운로드, 설치할 떄 사용하는 CLI(Command Line Client)를 포함한다.

npm install <packageName>

Node.js를 위한 소프트웨어 패키지 매니저

npm은 Node.js와 함께 설치된다. Node.js는 자바스크립트 런타임 환경이면, npm은 자바스크립트 패키지 관리자니까 말이다.

사실, npm이 처음에는 Node.js를 위한 패키지 매니저를 위해 만들어졌다고 한다.

모든 npm 패키지들은 package.json이라는 파일 내에 정의되고, 이는 모두 JSON으로 작성된다.

{
  "name": "note-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-scripts": "3.3.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Dependencies(의존성) 관리하기

npm에서의 의존성이란 해당 프로젝트가 돌아가기 위해 필요한 npm 패키지들이다. npm은 패키지 매니저이므로 이들을 관리한다. 이 Dependencies 또한 package.json에 정의되어있다.

그래서, 협업 시나 프로젝트를 클론해왔을 경우에도 node install을 통하여 관련 패키지를 바로 다운로드하여 코드를 실행시킬 수 있다.

 

📍 3. nvm이란?

이제 Node.js는 자바스크립트의 런타임 환경, npm은 자바스크립트코드로 사용할 수 있는 Node.js의 소프트웨어 패키지 매니저인 것을 알았다. 그렇다면 nvm은 무엇일까?

nvm이란

Node Version Manager으로, Node 의 여러 버전을 사용할 때 유용하다. (Node.js의 버전관리 도구)

협업시나 다양한 프로젝트를 진행 할 때, 우리는 다양한 라이브러리/프레임워크/개발툴 사용의 버전 호환 문제로 애를 많이 먹어왔다... 그리고 그 환경셋팅, 버전관리는 중요한 일에 집중하기 힘들게 하는 요인이기도 하다.

이 문제는 특히나 가상환경에서 심각하다. 그래서 그러한 문제를 해결하기위한 nvm이라는 아주 fancy한 도구를 사용하여 여러 버전의 Node.js의 버전을 관리한다.

  • 가상환경에서 다양한 버전의 node.js를 쉽게 설치하고 사용할 수 있다.
  • 최신의 node.js를 사용할 수 있다. (리눅스 운영체제의 패키지 매니저를 통해 nodejs를 설치하면 아주 오래된 버전이 설치되는 경우가 많음)
  • 여러 node.js 버전 간 전환이 쉽다

이 세가지는 nvm을 사용하는 아주 핵심 요인이 된다.

그래서 우리는 node를 먼저 설치하지 않고, nvm을 우선 설치한 후! → 설치한 nvm을 통해 원하는 특정 버전의 Node.js를 설치하는 방법이 나중을 위해 훨씬.. ✨좋다..

설치 방법

# curl, wget 을 이용하여 설치
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

$ source ~/.bash_profile


# 쉘 재시작 후 설치확인
nvm ls

# 노드 특정버전 설치(13.6.0)
nvm install 13.6.0

# 노드 최신버전 설치(알아서 최신버전으로 설치)
nvm install node

# 노드 설치 확인
node -v





🙇🏻‍♀️

Node js의 특징

NVM(Node Version Manager) 맥OS에서 설치 & 사용하기

nvm-sh/nvm