Node.js / NPM / NVM

ssongyi·2022년 5월 26일
0

리액트

목록 보기
2/3

1. Node.js 란?

  • 확장성 있는 네트워크 애플리케이션 개발에 사용되는 소프트웨어 플랫폼
  • Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임

** V8 : C++ 로 작성된 Google 의 오픈 소스 고성는 JavaScript 및 WebAssembly 엔진. Chorome 및 Node.js 에서 사용되며, ECMAScript 및 WebAssembly 를 구현한다.

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

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

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

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

그 뜻은 자바스크립트로 쓰여진 스크립트가 실행이 가능하다는 것인데, 이를 가능케 하는 것이 엔진, 크롬에서는 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

NPM 이란?

Node Package Manager으로, 자바스크립트를 위한 패키지 관리자이다.

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 이란?

NVM

Node Version Manager

한 마디로 Node.js 의 버전을 관리하는 도구.

NVM, 왜 사용해야 하나요?

협업을 할 때, 또는 다양한 프로젝트를 동시에 진행해야 할 때
다양한 라이브러리 / 프레임워크 / 개발툴의 버전 호환 문제를 겪기 때문!

NVM 의 장점

  • 가상환경에서 다양한 버전의 node.js를 쉽게 설치하고 사용할 수 있다.
  • 최신의 node.js를 사용할 수 있다. (리눅스 운영체제의 패키지 매니저를 통해 nodejs를 설치하면 아주 오래된 버전이 설치되는 경우가 많음)
  • use 커맨드를 이용해 다른 Node 버전으로 간단하게 스위칭할 수 있게 해줌
  • 디폴트 버전을 설정하거나 / 설치한 버전들의 전체 리스트를 확인하거나 / 필요 없는 버전을 삭제하는 등등 .. 소위 버전 관리가 쉬워짐

그래서 우리는 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

0개의 댓글