nodeJS - npm / express


npm(Node Package Manager)

패키지 : npm에 업로드된 노드 모듈. 모듈이 다른 모듈을 사용할 수 있는 것처럼 패키지가 다른 패키지를 사용 가능. (의존 관계)

  • pakage.json : 설치한 패키지의 버전을 관리하는 파일. 노드 프로젝트를 시작하기 전에는 폴더 내부에 무조건 package.json 파일을 만들고 시작해야한다. npm은 package.json을 만드는 명령어를 제공한다.

  • pakage.json 만들기 우선 콘솔로 프로젝트를 시작할 폴더로 이동한 후 명령어 $ npm init를 입력한다. (프로젝트 폴더 이름과 프로젝트 이름이 같으면 안된다.)

$ npm init

위 명령어를 입력하면 명령어 입력창이 계속 나온다. (일부 입력창은 선택 사항)

  • package name : 패키지 이름 입력. (package.json의 name 속성에 저장)
  • version : 패키지 버전 입력.
  • entry point : 자바스크립트 실행 파일 진입점 입력. 보통 마지막으로 module.exports를 하는 파일을 지정한다. (package.json의 main 속성에 저장)
  • test command : 코드를 테스할 때 입력할 명령어 입력. (package.json의 scripts 속성안의 test 속성에 저장)
  • git repository : 코드를 저장해 둔 깃 저장소 주소 입력. 나중에 소스에 문제가 생겼을 때 사용자들이 이 저장소에 방문해 문제를 제기 할 수 있고, 코드 수정본을 올릴 수도 있다. (package.json의 repository 속성에 저장)
  • keywords : 키워드는 npm 공식 홈페이지(https://npmjsd.com)에서 패키지를 쉽게 찾을 수 있도록 해준다. (package.json의 keywords 속성에 저장)
  • license : 해당 패키지의 라이센스를 넣으면된다.(오픈 소스라고 해서 모든 패키지를 아무런 제약 없이 사용 할 수 있는 것은 아니다. 라이센스 별로 제한 사항이 있으므로 라이센스를 확인해야한다. 상용 프로그램 개발시 법적 문제 발생할 수도 있음.)

위 사항들을 입력한 후 yes를 누르면 package.json 파일이 생성 완료된다.

package.json

{
  "name": "npmtest",
  "version": "0.0.1",
  "description": "hello package.json",
  "main": "index.js",
// scripts 부분은 npm 명령어를 저장해 두는 부분
// console에서 npm run [스크립트 명령어] 실행하면 해당 스크립트가 실행
  "scripts": {
    //   $ npm run   test 
    //  명령어를 입력하면 "Error: no test specified" && exit 1 실행됨
    "test": "echo \"Error: no test specified\" && exit 1"
    // test 외에도 scripts 속성에 명령어 여러개를 등록하여 사용할  있다.
    // 보통 start 명령어에 node [파일명] 저장해두고 npm start로 실행한다.
    // test나 start 같은 스크립트는 run을 붙이지 않아도 실행됨
  },
  "author": "creamer",
  "license": "ISC"
}
  • 패키지 설치

express 설치 (pakage.json이 있는 폴더의 콘솔에서 입력)

$ npm install express
npm notice created a lockfile as package-lock.json. You should commit this file.
// 메시지 중에 WARN이 나오는데 단순한 경고이므로 해결하지 않아도 된다. ERROR라고 나와야 진짜 ERROR. 
npm WARN npmtest@0.0.1 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors and audited 50 packages in 2.928s
// 취약점 검사
found 0 vulnerabilities
  • 패키지 설치 완료

package.json

{
  "name": "npmtest",
  "version": "0.0.1",
  "description": "hello package.json",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "creamer",
  "license": "ISC",
// 새롭게 추가된 부분
  "dependencies": {
    "express": "^4.17.1"
  }
}

추가로 node_modules 폴더도 생성된다. 해당 폴더 안에는 설치한 패키지들이 들어있다. express 하나만 설치했는데 패키지가 여러개 들어있다. 다른 패키지들은 Express가 의존하는 패키지들이다. 패키지 하나가 다른 여러 패키지에 의존하고, 그 패키지들은 또 다른 패키지들에 의존한다. 이렇게 의존 관계가 복잡하게 얽혀있어 package.json 파일이 필요하다.

package-lock.json 파일도 생성되었다. 내용을 보면 직접 설치한 express 외에도 node_modules에 들어있는 패키지들의 정확한 버전과 의존 관계가 담겨있다. npm으로 패키지를 설치, 수정, 삭제 할때 마다 패키지들 간의 내부 의존 관계를 이 파일에 저장한다.

  • 모듈 여러개 동시 설치하기

npm install [패키지1] [패키지2] [패키지3] […]

$ npm install morgan cookie-parser express-session
+ morgan@1.10.0
+ cookie-parser@1.4.5
+ express-session@1.17.1
added 10 packages from 5 contributors and audited 60 packages in 1.532s
found 0 vulnerabilities

위에서 설치한 패키지들은 package.json의 dependencies 속성에 기록된다.

package.json

...
  "dependencies": {
    "cookie-parser": "^1.4.5",
    "express": "^4.17.1",
    "express-session": "^1.17.1",
    "morgan": "^1.10.0"
  }
  • 개발용 패키지 설치 : 실제 배포 시에는 사용되지 않고 개발 중에만 사용되는 패키지들

npm install –save-dev [패키지1] [패키지2] [패키지3] […]

$ npm install --save-dev nodemon

개발용 패키지는 package.json의 새로운 속성인 devDependencies 속성에 추가된다. 개발 용 패키지들만 따로 관리 가능

package.json

  "devDependencies": {
    "nodemon": "^2.0.6"
  • npm 전역(global) 설치 옵션 : 패키지를 현재 폴더(node_modules)에 설치하는 것이 아니라 npm이 설치 되어있는 폴더(맥의 경우 /usr/local/lib/node_modules)에 설치한다. 전역 설치를 했다고 해서 패키지를 모든 곳에서 사용한다는 뜻은 아니고 대부분 콘솔의 명령어로 사용하기 위해 전역 설치를 한다. (전역 설치한 패키지는 package.json에 기록되지 않는다.)
$ sudo npm install --global rimraf
rimraf는 rm -rf(지정한 파일이나 폴더를 지우는 명령어)를 사용하게 해준다. 
/usr/local/bin/rimraf -> /usr/local/lib/node_modules/rimraf/bin.js
+ rimraf@3.0.2
added 12 packages from 4 contributors in 1.609s
  • 폴더 삭제하기
$ rimraf node_modules

위 명령어를 실행하면 node_modules에 있는 파일들이 삭제된다. 하지만 package.json에 설치한 패키지 내역이 들어 있으므로 npm install만 하면 알아서 다시 설치된다.

즉, node_modules는 언제든지 npm install로 설치 할 수 있으므로 node_modules는 보관할 필요가 없다. git 같은 버전 관리 프로그램과 같이 사용할때도 node_modules는 커밋하지 않는다. 중요한 파일은 package.json 이다.

전역 설치한 패키지는 package.json에 기록되지 않아 다시 설치 할때 어렵다. 이러한 경우 전역 설치 대신 npx 명령어를 사용하면된다.

$ npm install --save-def rimraf
$ npx rimraf node_modules
  • npm audit : npm 패키지들이 워낙 많다보니 일부 패키지는 악성 코드를 담고 있다. npm audit을 통해 취약점 검사 할 수 있다.
$ npm audit
  • npm audit fix : npm이 스스로 수정할 수 있는 취약점을 알아서 주기적으로 수정.
$ npm audit fix
  • npm에 없는 패키지 설치하기

모든 패키지가 npm에 등록되어있는 것은 아니다. 일부 패키지는 오픈소스가 아니거나 개발중이므로 깃허브나 nexus 등의 저장소에 보관되어있을 수도있다. 그러한 패키지들도 npm install [저장소 주소] 명령어를 통해 설치할 수 있다.

  • 명령어 줄여쓰기
npm install = npm i
--save-dev = -D
--global =  -g





© 2020.11. by creamer

Powered by CREAMer