5 분 소요


▶ 패키지매니저

▷ npm이란

npm(Node Package Manager)은 노드의 패키지 매니저이며 다른 사람들이 만든 소스 코드들을 모아둔 저장소이다.


  • 패키지: npm에 업로드된 노드 모듈
  • ★모듈이 다른 모듈을 사용할 수 있듯 패키지도 다른 패키지를 사용할 수 있음 (의존관계)


왜 npm을 사용하는가?

  1. 남의 코드를 이용하여 프로그래밍 가능
  2. 이미 있는 기능을 다시 구현할 필요가 없어 효율적




▶ package.json으로 패키지 관리하기

▷ package.json란

  • 설치한 패키지의 버전을 관리하는 파일
  • 같은 패키지라도 버전별로 기능이 다를 수 있으므로 버전을 기록해두어야 한다. (버전이 다를시 문제 발생할 수 있다.)

  • 노드 프로젝트 시작 전 반드시 package.json부터 만들고 시작해야한다. (npm init 명령어 입력)


질문! npminit은 무엇을 의미할까?

npm은 package.json을 만드는 명령어를 제공하며, init은initialize(초기화)를 의미한다.


▷ package.json 만들기

터미널이나 cmd에 npm init 입력 후 아래와같이 임력하기

package name: (폴더명) [프로젝트 이름 입력] version: (1.0.0) [프로젝트 버전 입력] description: [프로젝트 설명 입력] entry point: index.js test command: [엔터 키 클릭] git repository: [엔터 키 클릭] keywords: [엔터 키 클릭] author: [여러분의 이름 입력] license: (ISC) [엔터 키 클릭]

  • 예시로 프로젝트 이름은 npmtest, 버전은 0.0.1, 설명은 hello package.json, author는 sieun으로 설정하였다.


▷ package.json의 속성들

• package name: 패키지의 이름입니다. package.json의 name 속성에 저장됩니다.

• version: 패키지의 버전입니다. npm의 버전은 다소 엄격하게 관리됩니다. 5.3절에서 다룹니다.

• entry point: 자바스크립트 실행 파일 진입점입니다. 보통 마지막으로 module.exports를 하는 파일을 지정합니다. package.json의 main 속성에 저장됩니다.

• test command: 코드를 테스트할 때 입력할 명령어를 의미합니다. package.json scripts 속성 안의 test 속성에 저장됩니다.

• git repository: 코드를 저장해둔 깃(Git) 저장소 주소를 의미합니다. 나중에 소스에 문제가 생겼을 때 사용자들이 이 저장소에 방문해 문제를 제기할 수도 있고, 코드 수정본을 올릴 수도 있습니다. package.json의 repository 속성에 저장됩니다.

• keywords: 키워드는 npm 공식 홈페이지(https://npmjs.com)에서 패키지를 쉽게 찾을 수 있게 합니다. package.json의 keywords 속성에 저장됩니다.

• license: 해당 패키지의 라이선스를 넣으면 됩니다.


▷ 스크립트 실행

npm rum [프로젝트명] 으로 스크립트 실행




▶ 패키지 설치방법

npm install [패키지 이름]을 package.json이 있는 폴더의 콘솔에서 입력하면 설치가 된다.

npm install express 입력하여 패키지 설치 (install 대신 i 입력 가능)


설치된 패키지는 package.json에 기록된다.


▷ 자동 생성된 폴더

npm install시 node_modules 폴더 자동 생성되었다.

node_modules 폴더 내부에 설치한 패키지들이 들어있다.


  • 분명히 Express 하나만 설치했는데 패키지가 여러 개 들어 있다.

  • 이는, express 외에도 express와 의존 관계가 있는 패키지들이 모두 설치된 것이다.

  • 이렇게 의존 관계가 복잡하게 얽혀 있어 package.json이 필요한 것이다.

아까도 말했듯 ★모듈이 다른 모듈을 사용할 수 있듯 패키지도 다른 패키지를 사용할 수 있는 것을 의존관계라고 한다.


package-lock.json도 생성되어 패키지간 의존 관계를 명확하게 표시하였다. (package.json은 직접 설치한 패키지를 기록하는 파일이다.)


▷ 모듈 여러 개 동시 설치

npm i 패키지1 패키지2 패키지3 로 패키지 동시 설치 가능하다.


▷ 개발용 패키지 설치

  • 개발용 패키지는 실제 배포 시에는 사용되지 않고, 개발 중에만 사용된다.
  • stall --save-dev [패키지] [...] 로 설치 가능하다.
  • –save-dev가 개발용 패키지임을 나타낸다.


▷ 글로벌(전역) 설치

  • 패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더에 설치하는 것이다.
  • 모든 프로젝트와 콘솔에서 패키지를 사용할 수 있다.

  • npm install --global 패키지명 또는 npm i --g 패키지명 로 설치 가능 하다.


  • 전역 설치한 패키지는 package.json에 기록되지 않아 다시 설치할 때 어려움이 있으므로 추천 x

  • 대신 npx를 사용하면 글로벌 설치 없이 글로벌 명령어 사용 가능


## ▷ node_modules 내부 수정하기

  • node_modules 내부의 수정 사항을 영구적으로 반영해주는 patch-package 패키지 사용

  • package.json을 아래와 같이 수정하고 patch-package 패키지를 설치

    1. package.json 수정
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "postinstall": "patch-package"
  },
  1. patch-package 패키지 설치
npm i patch-package
(node_modules 내부의 원하는 패키지 수정하기)
npx patch-package [수정한 패키지 이름]
  • 이러면 patches 폴더가 생성되고 그 안에 patch 확장자를 가진 파일이 생성된다.

  • 이후 npm i를 해도 patch-package가 patch 파일을 읽어서 수정 사항을 적용한다.




▶ 패키지 설치하기

▷ express 패키지

npm install express 입력 (install 대신 i 입력 가능)


npm install morgan cookie-parser express-session

▷ nodemon 패키지

소스 코드가 바뀔 때마다 자동으로 노드를 재실행해주는 패키지이다. npm install --save-dev nodemon


▷ rimraf 패키지

  • rimraf는 리눅스나 맥의 rm -rf 명령어를 윈도에서도 사용할 수 있게 해주는 패키지이다.
  • rm -rf는 지정한 파일이나 폴더를 지우는 명령어이다.

  • 설치방법1 전역패키지로 설치 (추천x): npm i --g rimraf
  • 설치방법2 npx으로 설치: npx rimraf


npx으로 node_modules 삭제해보자

rimraf node_modules입력하기 삭제된 모습 확인할 수 있다.


  • node_modules는 언제든지 npm install로 설치할 수 있으므로 node_modules는 보관할 필요가 없다.
  • 깃 같은 버전 관리 프로그램과 같이 사용할 때도 node_modules는 커밋하지 않는다.

  • 요한 파일은 package.json과 package-lock.json이다.




▶ 패키지 버전 이해하기

▷ SemVer

  • 노드 패키지들의 버전은 항상 세 자리로 이뤄져 있는데, SemVer 방식의 버전 넘버링을 따르기 때문이다.
  • SemVer는 Semantic Versioning(유의적 버저닝)의 약어로 버전을 구성하는 세 자리가 모두 의미를 갖고 있다는 뜻이다.

질문! 왜 SemVer 방식을 사용할까?

노드에서는 배포를 할 때 항상 버전을 올려야 하는데 각각의 패키지는 모두 버전이 다르기 때문에 버전 번호를 어떻게 정하고 올려야 하는지를 명시하는 규칙이 필요하기 때문!


  • major: 메이저 버전은 하위 호환이 안 될 정도로 패키지의 내용이 수정되었을 때 올림 예를 들어 1.5.0에서 2.0.0으로 올렸다는 것은, 1.5.0 버전 패키지를 사용하고 있던 사람들이 2.0.0으로 업데이트했을 때 에러가 발생할 확률이 크다는 뜻

  • minor: 마이너 버전은 하위 호환이 되는 기능 업데이트를 할 때 올림. 버전을 1.5.0에서 1.6.0으로 올렸다면, 1.5.0 사용자가 1.6.0으로 업데이트했을 때 아무 문제가 없어야 함

  • patch: 새로운 기능이 추가되었다기보다는 기존 기능에 문제가 있어 수정한 것을 내놓았을 때 패치 버전을 올림. 당연히 업데이트 후 아무 문제가 없어야 함


▷ 버전기호

  • 버전 앞에 기호를 붙여 의미를 더한다.




▶ 기타 npm 명령어

  • npm outdated: 어떤 패키지에 기능 변화가 생겼는지 알 수 있음

-> Current와 Wanted가 다르다면 업데이트가 필요한 경우이다. 이럴 때는 npm update [패키지 이름]으로 업데이트할 수 있다. -> npm update를 하면 업데이트 가능한 모든 패키지가 Wanted에 적힌 버전으로 업데이트된다. -> Latest는 해당 패키지의 최신 버전이지만 package.json에 적힌 버전 범위와 다르다면 설치되지 않는다.


  • npm uninstall 패키지명: 패키지 삭제(npm rm 패키지명으로도 가능)

-> node_modules 폴더와 package.json에서 사라짐 -> pm rm [패키지 이름]으로 줄여 쓸 수도 있음


  • npm search 검색어: npm 패키지를 검색할 수 있음

-> 윈도나 맥에서는 브라우저를 통해 npm 공식 사이트(https://npmjs.com)에서 검색하면 편리


  • npm info 패키지명: 패키지의 세부 정보 파악 가능

-> package.json의 내용과 의존 관계, 설치 가능한 버전 정보 등이 표시


  • npm adduser: npm에 로그인을 하기 위한 명령어

  • npm whoami: 현재 사용자가 누구인지 알려줌

  • npm logout: 로그인한 계정을 로그아웃

  • npm version 버전: package.json의 버전을 올림

  • npm publish: 자신이 만든 패키지를 배포할 때 사용

  • npm unpublish: 배포한 패키지를 제거할 때 사용(24시간 이내에 배포한 패키지만 제거 가능)


  • npm deprecate [패키지 이름] [버전] [메시지]: 해당 패키지를 설치할 때 경고 메시지를 띄우게 함

-> 다른 사용자들이 버그가 있는 버전의 패키지를 설치할 때 경고 메시지가 출력


이외에도 많은 명령어가 있는데, npm 공식 문서(https://docs.npmjs.com/)의 CLI Commands에서 확인 가능하다.




▶ 패키지 배포 및 취소

▷ 패키지 배포하기

  1. 회원가입
  • npm 웹 사이트(https://www.npmjs.com) 우측 상단의 Sign Up을 눌러 회원 가입하기

  • 회원 가입 confirm 메일을 확인하기

  • 콘솔에서 npm login 명령어를 입력해 생성한 계정으로 로그인하기(가입 시 입력했던 이메일로 OTP 입력해야 로그인된다.)


  1. 배포할 패키지 작성
  • 패키지로 만들 코드를 작성하기

  • package.json의 main 부분의 파일명과 일치해야 한다(npm에서 이 파일이 패키지의 진입점임을 알 수 있기때문)


  1. 배포 시도하기 npm adduser로 먼저 로그인 한 후 npm publish 입력
  • npmtest란 이름을 누가 사용중이기 때문에 에러 발생
  • 이름이 겹치면 안되므로 다른 것으로 바꿔서 배포

  • 누군가가 이름을 사용하고 있는지 확인하기: npm info [패키지 이름]

  • package.json에서 원하는 이름으로 name을 바꾸고, 다시 npm publish 명령어를 입력


▷ 패키지 배포 취소하기

72시간 내에 npm unpublish 패키지명 --force 입력




댓글남기기