Node Framework이 여러분 컴퓨터에 설치되면 Node 와 NPM 두개의 소프트웨어가 설치됩니다.
NODE 는 여러분이 향후 자바스크립트로 개발한 소스를 실행시키고 결과물을 확인할수 있는  런타임환경을 제공해주는 SW이고
NPM(Node Package Manager)은 오픈소스로 개발된 각종 자바스크립트 또는 노드 기반 SW(패키지,라이브러리)를 오픈소스저장소에서 여러분의 로컬 개발 컴퓨터 환경 또는 서버 서비스환경,
그리고개발 프로젝트 소스등에 손쉽게 설치하고 사용 및 오픈소스 패키지 SW를 관리해주기 위한 Node Package Manager(NPM) 소프트웨어 입니다.

NODE와 NPM SW 제어를 위해서는 각각 고유 명령어를 사용해야하며
NODE는 node 명령어 NPM은 npm 명령어를 통해 관련 SW를 사용해 소스를 실행하거나 각종 오픈소스 패키지의 설치 및 관리를 진행합니다. 

Node,NPM 의 설치여부와 설치된 버전을 node,npm명령어를 통해  확인해보도록 하겠습니다.


1) 윈도우 Command Prompt환경에서 node,npm 설치여부 및 버전 확인하기

node -v
v20.10.0

npm -v or npm -version
10.2.3


2) VSCode 환경에서 node,npm 설치여부 및 버전 확인하기
-VSCode를 실행합니다.
-VSCode 상단메뉴>터미널>새터미널 메뉴를 클릭합니다.
-VSCode하단에 터미널 메뉴를 선택하고 아래 명령어를 입력해봅니다.

node -v
v20.10.0

npm -v or npm -version
10.2.3

Node Framework를 정상 설치했는데 아무 버전도 안나온다면  관리자 권한으로 커맨드프롬프트나 VSCode를 실행해보세요.
특정 버전이 출력된다면 정상적으로 Node Framework와 NPM SW가 설치된것입니다.


3) NPM 주요 용어정리

Node Package : Node 기반 실행 가능한 자바스크립트로 개발된 모든 SW를 말함
Node Package Store(노드패키지저장소) : 주로 오픈소스로 개발된 Node Package 소프트웨어를 특정 인터넷 저장소 공간에 공유하여 필요한 개발자가 언제든 필요한 곳에서 다운로드 해서 사용할수 있는 인터넷 저장소 환경 제공
Node Package Manager(npm) : Node Package Store(노드패키지저장소)에 공유된 특정 오픈소스 패키지를
  NPM은 손쉽게 npm명령어를 통해 필요한 컴퓨터(개발/서버) 또는 개발 프로젝트에 다운로드,설치하여 사용할수 있게 해주는 Node Package 관리용 소프트웨어. 

package.json 파일: 개발자가 개발하는 노드 프로젝트(패키지)의 기본 정보를 JSON형식으로 관리하고 해당 프로젝트에서 사용한  오픈소스 패키지 설치이력 정보를 관리해주는 중요 노드 프로젝트 설정파일
ㄴ개발자가 생성한 노드 프로젝트(패키지)의 기본 정보와 버전 및 저장소에서 다운로드 설치한 각종 오픈소스 패키지 설치 이력 정보를 관리하는 파일
ㄴ노드 프로젝트는 하나의 package.json 파일 생성이 반드시 필요합니다.
ㄴ프로젝트 생성시 packange.json 파일이 기본 생성됩니다.

일반적으로 노드 기반 개발자들은 오픈소스 노드 패키지 저장소에서 NPM명령어를 이용해 각종 오픈소스 패키지를 개발 또는 서비스 환경으로 다운로드 설치하여 빠르게 오픈소스 기반으로 프로젝트의 개발 및 서비스가 가능합니다.


4) 주요 npm 명령어 실습 

지금부터 npm 주요 명령어를 통해 간단한 노드 프로젝트 생성 및 다양한 오픈소스 노드패키지 설치 및 사용법들에 대해 알아보도록 하겠습니다.

A)간단한 Node 프로젝트 만들어 보고 실행해보기
먼저 VSCode를 실행하고 상단 메뉴 파일>폴더열기 를 클릭하여 작업폴더를 지정합니다.
예시)D:\....\Backend\

작업 폴더 아래에 basic-node-app 새 폴더(프로젝트 폴더)를 생성합니다.
좌측 메뉴 탐색기 메뉴클릭 > 작업폴더 선택>새폴더 클릭
D:\....\Backend>basic-node-app

터미널창에서 cd 명령어를 통해 해당 빈 basic-node-app 프로젝트 폴더 경로로 이동합니다.
cd basic-node-app
D:\....\Backend\basic-node-app>


터미널에서 npm init 명령어를 입력하고 실행합니다.
npm init 명령어는 해당 명령어를 실행하는 위치의 폴더를 노드프로젝트 폴더로 지정하고 노드 프로젝트 기본환경을 구성해주는 기초 npm 프로젝트 명령어입니다.

init명령어를 통해 프로젝트명,버전명,기본 프로젝트 설정정보를 프롬프트를 환경을 통해 설정하고 설정된 정보를 package.json 프로젝트(패키지) 설정파일을 만들고 내용을 기록합니다.
엔터를 입력하면 (디폴트설정값)으로 기본 설정됩니다.


package name: (basic-node-app) -엔터

version: (1.0.0)-엔터

description: 기초노드앱 샘플 프로젝트입니다.

entry point: (index.js) -엔터

test command:-엔터

git repository:-엔터

keywords:-엔터

author:-엔터

license: (ISC)-엔터

About to write to D:\Mixed-Code-Pilot\NodeJS\Backend\basic-node-app\package.json:


{

  "name": "basic-node-app",

  "version": "1.0.0",

  "description": "기초노드앱 샘플 프로젝트입니다.",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "author": "",

  "license": "ISC"

}


Is this OK? (yes)-엔터

VSCode 탐색기에 basic-node-app폴더를 열어보면 package.json파일이 생성된것을 확인하고 파일을 열어 내용을 확인해봅니다.
npm init npm 명령어는 해당 명령어가 실행되는 폴더를 프로젝트 폴더로 지정하고 노드 프로젝트(패키지)의 기본 설정을 프롬프트형태로
자동으로 구성해주고 프로젝트 정보관리 중요 파일인 package.json파일을 생성해주는 역할을 제공합니다. 


탐색기에서 basic-node-app폴더를 선택하고 새파일 index.js 새파일을 추가합니다.
파일의 확장자가 .js파일들은 기본적으로 node프레임워크를 통해 실행해볼수 있습니다.
index.js 파일안에 아래 코드 한줄  코딩하고 저장합니다.

console.log('자바스크립트 모듈이 실행되었습니다.');

만들어진 index.js 파일을 터미널창 에서 아래 node 명령어를 통해 실행해봅니다.

 node index.js  or node index 

* node 명령어를 이용해 index.js 파일을 node framework기반으로 실행시켜 결과를 확인하는 명령어입니다.
* 확장자는 삭제가능합니다.
* 만드시 터미널창의 경로는 D:\....\Backend\basic-node-app>에서 해당 명령어를 실행해야합니다.


console.log('자바스크립트 모듈이 실행되었습니다.');



자바스크립트 파일(모듈파일)은 node명령어를 통해 기본 실행합니다.
node 자바스크립트 파일 또는 파일 확장자 생략

정상적으로 터미널창에 로그 메시지가 출력되면 정상적으로 자바스크립파일이 node framework을 통해  실행된것입니다.



npm 명령어를 통해 오픈소스 패키지를 설치하는 방법은 크게 3가지 방식 이 있습니다.


첫번째 : 서비스 용도(실제 서비스 기능 개발을 위해 사용하는) 오픈소스 패키지 설치 사용
ㄴ노드 프로젝트 내 특정 폴더(node_modules)에 설치하고 프로젝트 소스에서 참조해 사용하는 방법

두번쨰 : 개발 생산성/효율성을 위해 개발환경에서만 사용하는 오픈소스 노드 패키지 설치 사용
ㄴ서비스용도 패키지 설치 목적이 아닌 개발시에만 개발환경에서만 사용하는 노드패키지를 노드 프로젝트내 특정 폴더(node_modules)에 설치해 사용하는 경우 

세번째 : 개발컴퓨터/서버 컴퓨터 전역공간에 한번만 설치해서 모든 노드 프로젝트에서 사용하는 전역 노드 패키지 설치
ㄴ개발자 컴퓨터나 서비스 서버 내 전역공간에 한번만 설치하고 모든 노드 프로젝트 또는 노드 서비스에서 사용하는 오픈소스 패키지 설치

네번째 : 최신버전 오픈소스 패키지를 다운로드 설치후 기능 구현/실행 후 다운로드 받은 소스를 제거하여 버전 이슈 및 디스크 용량 이슈를 개선하는 방법으로 오픈소스 패키지 사용하는 방법
ㄴnpx 란 npm 대체 명령어를 이용하면 오픈소스 패키지를 다운로드 설치, 사용후 설치된 소스를 제거하는 방식으로 패키지를 관리하는 신규 방식 제공

B) 프로젝트에 서비스용 Node Package 설치 및 사용하기 

지금부터 기본 노드프로젝트에 Node Package Store(노드패키지저장소)에서 서비스 기능 개발을 위한 오픈소스 패키지 하나를
프로젝트에 설치해 사용해보는 과정부터 실습을 통해 알아보도록 하겠습니다.

npm i 설치패키지명  또는 npm install 설치 패키지명
예시) npm i moment  or npm install moment 

여러 패키지 동시에 설치하기
npm i 설치패키지명 설치패키지명 설치패키지명
예시) npm i moment bcryptjs dotenv


현재 프로젝트 폴더 경로에서 VSCode 터미널 창에 아래 npm i 명령어를 실행합니다. 
npm i moment

moment 노드패키지는 자바스크립트 날짜 숫자형 포맷을 원하는 문자열 포맷으로 변경해주는 오픈소스패키지입니다.

npm i moment  명령어를 통해 패키지 저장소에서 moment패키지를 프로젝트로 다운로드 후 프로젝트 루트에
node_modules 프로젝트 패키지 설치폴더에 패키지를 설치하고 package.json 파일내 dependencies 영역에 설치 패키지의 버전을 기록(명세)합니다.

basic-node-app 프로젝트 폴더내 node_modules 패키지 설치 폴더가 생성된것을 확인하고 package.json 파일을 열고 dependencies 속성에 설치된 moment패키지의 버전명이 기록되어 있는지 확인해봅니다.
설치된 moment패키지를 사용해 프로젝트에서 간단한 기능구현 코딩을 진행해봅니다.

//설치한 오픈소스 노드 패키지를 참조한다.
//node.js에서는 require('설치패키지명')예약어를 통해 지정한 설치된 노드패키지를 참조합니다.
//moment패키지는 자바스크립트 일자/시간정보를 개발자가 원하는 문자포맷으로 표현해주는 기능제공공
const moment = require('moment');


console.log('자바스크립트 모듈이 실행되었습니다.');


//순수 자바크스립트 일시/시간정보를 출력해보자
console.log("순수자바크스립트 일시정보:",Date.now());


//moment 패키지를 이용해 자바스크립트 일시정보를 출력해보자
console.log("모멘트 패키지를 통한 날짜포맷 표현하기:",moment(Date.now()).format("YYYY-MM-DD HH:mm:ss"));


index.js 파일을 오픈하고 프로젝트에 설치된
moment 패키지를 참조하여 원하는 날짜 포맷으로 현재 날짜/일시 정보를 변환 터미널 영역에 출력해봅니다.
소스를 아래와 같이 코딩하고 저장후 터미널에서 node index.js 명령어를 실행시킵니다.
정상적으로 자바스크립트 숫자형 날짜포맷과 원하는 문자열 날짜 포맷이 출력되는지 확인합니다.


지금 까지 간단히 서비스 개발에 필요한 오픈소스 패키지의 다운로드 및 설치,사용과정에 대해 학습해 보았습니다.

설치된 패키지의 삭제는 아래 명령어를 사용해 삭제합니다.
npm uninstall 패키지명
예시) npm uninstall moment

설치된 패키지가 삭제되면 package.json 내 dependencies 속성에서 설치명세도 삭제되고 node_modules폴더 실제 설치된 소스도 삭제됩니다.


C) 프로젝트에 개발환경 지원 Node Package 설치하기 

오픈소스 패키지들중에는 서비스 개발에 필요한 패키지도 있지만 개발시에만 개발환경에서만 설치해 개발의 생산성과 효율성을 담보해주기위해 설치해 사용하는 오픈소스 패키지들도 존재합니다.
이러한 패키지를 개발(환경지원)용 패키지라 하며 개발환경 지원 패키지는 npm 명령어를 통해 설치하는 방법이 아래와 같이 추가옵션 설정이 추가됩니다.

npm install 설치할 개발환경 지원용 패키지명 --save-dev
예시) npm install nodemon --save-dev

** nodemon은  node express 백엔드 개발시 백엔드 개발소스 저장 및 서버를 통한 서비스 실행을 자동화해주는 개발용 노드 패키지입니다.

개발환경 지원용 패키지들은  프로젝트 폴더내 node_modules 패키지 설치 폴더에 설치되며 package.json 파일내 devdependencies 속성에 설치된 개발용 패키지명세가 기록됩니다. 

{
  "name": "basic-node-app",
  "version": "1.0.0",
  "description": "기초노드앱 샘플 프로젝트입니다.",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "moment": "^2.30.1"
  },
  "devDependencies": {
    "nodemon": "^3.1.3"
  }
}



D) 컴퓨터 전역(Global)환경에 Node Package 설치하기

npm i 패키지명 명령어를 통해 패키지를 설치하면 일반적으로 현재 작업중인 프로젝트 폴더 공간의 node_modules 공간에 패키지가 설치되지만 매번 프로젝트마다 공통적으로 사용하는 패키지들을 매번 프로젝트에 설치해 사용하는것은 비효율적인 방법입니다

이런 종류의 패키지를 전역 패키지라고 하며 전역 패키지는 개발하는 컴퓨터나 서비스되느 서버의 전역공간에 한번만 설치하고 프로젝트나 서비스에서 사용할수 있게 전역 패키지를 설치해야합니다.

npm install -global 전역패키지명  또는    npm i -g 전역패키지명

예시) 위에서 설명드린 nodemon 같은경우도 개발환경에서는 전역으로 설치해서 사용하곤 합니다.
전역으로 설치하는 패키지들은 주로 개발 또는 서비스할때 필수적으로 설치해야하는 패키지를 전역패키지로 설치합니다. 

npm install -global nodemon 
npm i -g express-generator
npm install -g sequelize-cli

전역 공간에 설치된 패키지는 현재 개발중인 프로젝트의 node_modules 폴더에 패키지들를 설치하지 않고 컴퓨터 전역 공간에 패키지를 설치하여 컴퓨터내 모든 노드 프로젝트에서 사용 및 실행이 가능하게되며
윈도우즈 개발환경의 경우  c:\users\사용자계정\appdata\roaming\npm 경로내에 전역패키지가 설치됩니다.
전역으로 설치한 패키지는 개별 프로젝트에 package.json파일에 기록되지 않는다는점 주의하시기 바랍니다. 



E) packange.json 파일기반 Node Package 일괄 복원 설치하기

노드 프로젝트의 서비스 기능 개발 또는 개발용 패키지를 설치한 경우는 프로젝트 폴더내 node_modules 영역에 실제 패키지가 다운로드 설치되며 프로젝트 폴더 루트에 package.json 파일에 설치이력(패키지명, 설치버전)이 기록됩니다. 

개발중인 노드 프로젝트에서 가장 용량을 많이 차지하는 영역이 바로 node_modules 폴더인데요
프로젝트 소스를 직접 다른 사람들에게 공유한다거나 또는 Git에 의해 버전관리를 하고 GitHub와 같은 원격 저장소를 통해
공유할때 node_modules폴더내 설치된 모든 패키지 소스를 공유하거나 변경이력을 관리한다면 상당히 비효율적이게 됩니다. 

따라서 개별 프로젝트 소스를 압축해 누군가에게 직접 보낸다거나 git/github등으로 소스를 공유한다면 node_modules 내용은 삭제하거나 제외하고 소스를 제공하는게 일반적이며 순수 개발소스만 제공받는 측에서는 해당 프로젝트에서사용했던 서비스용 패키지들은  package.json 파일의 dependencies/devdependencies 속성에 명세된 서비스/개발용 패키지 정보를 이용해  일괄 패키지 복원설치 방법을 아래와 같이 제공합니다. 

npm i  또는 npm install 

설치할 패키지명 없이 위와 같이 터미널에서 명령어를 실행하면 package.json 파일의 dependencies/devdependencies 속성에 명세된 서비스/개발용 패키지 정보를 기반으로 일괄 패키지들을 다운로드 설치진행해주고 관련 패키지들을 node_modules폴더내에 설치진행해줍니다.


지금까지 npm의 주요 명령어를 알아 보았습니다.
노드오픈소스 저장소에서 제공하는 각종 오픈소스 노드패키지들을 여러분의 프로젝트, 개발용 컴퓨터, 서비스 서버환경에 설치하고
패키지들을 관리해주는 기능을 제공하는 npm 기초 명령어는 반드시 숙지해주시고 이 밖에도 추가적은 npm 명령어 들이 존재합니다 


Tips) NPM Vs NPX Vs YARN
노드 기반 패키지 관리용 SW의 종류는 대표적으로 npm,npx,yarn등 다양하게 제공됩니다.

NPM (Node Package Manager) 은 전통적으로 제공되는 노드 패키지 관리용 SW이고

NPX (Node Package eXecute) 는 npm 의 몇몇 단점을 보완하기 위해 npm 5.2.0 이상버전부터 npm내에 포함된 패키지 실행 명령어입니다.
ㄴnpx 명령어의 주요 특징으로는 인터넷 저장소에서 패키지를 다운로드 특정 공간에 설치후 관련 기능을 실행후 설치된 패키지를 삭제해 패키지 설치로 인한 공간부족 이슈와 최신버전의 노드패키지만을 설치 사용해 노드패키지의 버전충돌문제를 개선시켜줍니다. 주로 전역 패키지 설치시 npx 명령어로 패키지를 설치해 전역공간에 설치된 특정 패키지들의 버전이슈/저장 공간이슈등의 문제를 개선합니다.
예시) npx create-react-app reactdemoapp 

YARN (Yet Another Resource Negotiator)은 npm 패키지 관리자의 속도 및 안정성 및 보안성등에 대한 단점을 보완하기 위해 나온 패키지 관리자 SW로 백엔드 뿐만 아니라 최신의 프론트엔드 프레임워크(React,Next,Vue,Angular) 기반 프론트엔드 개발시 주로 많이 사용하는 노드 패키지 관리자입니다. 주요 명령어는 npm과 유사합니다. 

npm을 대체하는 yarn명령어를 기반으로 노드 패키지를 설치관리합니다. 
npm install -g yarn : yarn 패키지관리자 sw설치
yarn init  : 프로젝트 생성
yarn add 패키지명  : 신규 패키지 설치
yarn install  : 패키지 일괄복원설치
yarn remove 패키지명 : 패키지삭제