npm

유석현(SeokHyun Yu)·2022년 12월 3일
0

Node.js

목록 보기
5/29
post-thumbnail

1. npm 알아보기

npmNode Package Manager의 약어로, 이름 그대로 노드의 패키지 패니저이다.

npm에는 약 130만 개에 달하는 패키지가 등록되어 있다.

이는 세계 최대 규모이다.

방대한 양의 패키지는 노드와 자바스크립트의 생태계를 더욱 견고하게 만들고 있으며 대부분 오픈 소스여서 노드를 사용해 웹을 개발할 떄 많은 도움이 된다.

npm에 업로드된 노드 모듈을 패키지라고 부른다.

모듈이 다른 모듈을 사용할 수 있는 것처럼, 패키지가 다른 패키지를 사용할 수도 있다.

이런 관계를 의존 관계라고 부른다.

의존 관계는 다음 단락에서 알아볼 것이다.

npm의 대체자로 yarn이 있으며 페이스북이 내놓은 패키지 매니저이다.


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

서비스에 필요한 패키지를 하나씩 추가하다 보면 어느새 패키지 수가 100개를 훌쩍 넘어버리게 된다.

그리고 사용할 패키지는 저마다 고유한 버전이 있으므로 어딘가에 기록해두어야 한다.

같은 패키지라도 버전별로 기능이 다를 수 있으므로 프로젝트를 설치할 때 패키지도 동일한 버전을 설치하지 않으면 문제가 생길 수 있다.

이때 설치한 패키지의 버전을 관리하는 파일이 바로 package.json이다.

따라서 노드 프로젝트를 시작하기 전에는 폴더 내부에 무조건 package.json부터 만들고 시작해야 한다.

npm은 package.json을 만드는 명령어를 제공한다.

프로젝트를 시작할 폴더로 이동해서 npm init -y 명령으로 package.json을 생성해보자.

위 json 파일에서 다른 속성은 그렇게 신경쓰지 않아도 되고 "sciprts"만 잘 보면 되는데, 이는 npm 명령어를 저장해두는 속성이다.

콘솔에서 npm run {지정한 명령어}를 입력하면 해당 스크립트가 실행된다.

예를 들어, npm run test를 하면 echo \"Error: no test specified\" && exit 1을 입력한 것과 똑같은 효과를 낼 수 있다.


이제 패키지들을 설치해보자.

npm install {패키지 이름}을 package.json이 있는 폴더의 콘솔에서 입력하면 된다.

드디어 첫 패키지를 설치했다.

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

"dependencies"라는 속성이 새로 생겼고, express라는 이름과 함께 설치된 버전이 저장되었다.

버전 앞에 ^ 표시가 붙어있는데, 여기에는 특별한 의미가 있다.

다음 단락에서 자세히 알아보겠다.

추가로 node_modules라는 폴더도 생성되었다.

그 안에는 설치한 패키지들이 들어있다.

분명히 express 하나만 설치했는데 패키지가 여러 개 들어있는 것을 볼 수 있다.

이는 express가 의존하는 패키지들이다.

패키지 하나가 다른 여러 패키지에 의존하고, 그 패키지들은 또 다른 패키지들에 의존한다.

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

package-lock.json이라는 파일도 생성되었다.

내용을 보면 직접 설치한 express 외에도 node_modules에 들어 있는 패키지들의 정확한 버전과 의존 관계가 담겨 있다.

npm으로 패키지를 설치, 수정, 삭제할 때마다 패캐지들 간의 내부 의존 관계를 이 파일에 저장한다.

지금은 아니지만, 나중에 패키지를 설치할 때 가끔씩 "audited {숫자} package"라는 문장이 출력될 수도 있다.

이는 패키지에 있을 수 있는 취약점을 자동으로 검사했다는 의미이다.

`npm audit`은 패키지의 알려진 취약점을 검사할 수 있는 명렁어이다.

npm에 패키지들이 워낙 많다 보니 일부 패키지는 악성 코드를 담고 있다.

이런 것들이 npm에 보고되는데 npm audit을 통해 내가 혹시 악성 코드가 담긴 패키지를 설치하지 않았는지 검사할 수 있다.

`npm audit fix`를 입력하면 npm이 스스로 수정할 수 있는 취약점을 알아서 수정한다.

주기적으로 수정해주자.

모듈 여러 개를 동시에 설치할 수도 있다.

npm install {패키지 이름1} {패키지 이름2} {패키지 이름3} ...과 같은 식으로 npm install 뒤에 설치하고 싶은 패키지들을 나열하면 된다.


개발용 패키지를 설치할 수도 있다.

실제 배포 시에는 사용되지 않고 개발 중에만 사용되는 패키지들이다.

npm install --save-dev {패키지 이름}로 설치한다.


npm에는 전역 설치라는 옵션도 있다.

패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더에 설치한다.

npm install --global {패키지 이름} 명령을 사용한다.

참고로 전역 설치한 패키지는 package.json에 기록되지 않는다.


node_modules 폴더는 package.json 파일만 있으면 실수로 지워져도 상관없다.

package.json에 설치한 패키지 내역이 들어 있으므로 npm install 명령만 입력하면 알아서 다시 설치된다.

즉, node_modules는 언제든지 npm install로 설치할 수 있으므로 따로 신경써서 보관할 필요가 없다.

Git 같은 버전 관리 프로그램과 같이 사용할 때도 node_modules는 커밋하지 않는다.

중요한 파일은 package.json이다.

`npm install` 명령어는 `npm i`로 줄여 쓸 수 있다.
`--save-dev` 옵션은 `-D`로, `--global` 옵션은 `-g`로 줄여 쓰기도 한다.

3. 패키지 버전 이해하기

노드의 패키지들의 버전은 항상 세 자리로 이루어져 있다.

심지의 노드의 버전도 세 자리이다.

버전이 세 자리인 이유는 SemVer 방식의 버전 넘버링을 따르기 때문이다.

SemVer는 Semantic Versioning의 약어이다.

버전을 구성하는 세 자리가 모두 의미를 가지고 있다는 뜻이다.

package.json을 구성하는 각각의 패키지는 모두 버전이 다르고 패키지 간의 의존 관계도 복잡하다.

만약 어떤 패키지의 버전을 업그레이드 했는데, 그것을 사용하는 다른 패키지에서 에러가 발생한다면 문제가 된다.

많은 패키지가 서로 얽히다 보면 이 문제는 점점 더 심각해진다.

따라서 버전 번호를 어떻게 정하고 올려야 하는지를 명시하는 규칙이 등장했는데, 이것이 바로 SemVer이다.

버전의 첫 번재 자리major 버전이다.

major 버전이 0이면 초기 개발 중이라는 뜻이다.

1부터는 정식 버전을 의미한다.

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

두 번째 자리minor 버전이다.

minor 버전은 하위 호환이 되는 기능 업데이트를 할 때 올린다.

버전은 1.5.0에서 1.6.0으로 올렸다면, 1.5.0 사용자가 1.6.0으로 업데이트했을 때 아무 문제가 없어야 한다.

세 번재 자리patch 버전이다.

새로운 기능이 추가되었다기보다는 기존 기능에 문제가 있어 수정한 것을 내놓았을 때 patch 버전을 올린다.

1.5.0에서 1.5.1처럼 말이다.

당연히 업데이트 후 아무 문제가 없어야 한다.


package.json에는 SemVer식 세 자리 버전 외에도 앞에 ^이나 ~또는 >,<같은 문자가 붙어 있다.

이 문자는 버전에는 포함되지 않지만 설치하거나 업데이트할 때 어떤 버전을 설치해야 하는지 알린다.

가장 많이 보는 기호는 ^이며, minor 버전까지만 설치하거나 업데이트한다.

npm i express@^1.1.1이라면 1.1.1 이상부터 2.0.0 미만 버전까지 설치된다.

2.0.0 이상은 설치되지 않는다.

npm i express@1.x.x와 같이 표현할 수도 있다.

~기호를 사용한다면 patch 버전까지만 설치하거나 업데이트 한다.

npm i express@~1.1.1이라면 1.1.1 이상부터 1.2.0 미만 버전까지만 설치된다.

1.1.x와 같은 표현도 가능하다.

추가적으로 @latest도 사용하는데, 안정된 최신 버전의 패키지를 설치한다.

x로도 표현할 수 있다(예: npm i express@latest 또는 npm i express@x).

@next를 사용하면 가장 최근 배포판을 사용할 수 있다.

@latest와 다른 점은 안정되지 않은 알파나 베타 버전의 패키지를 설치할 수도 있다는 것이다.


  1. 기타 npm 명령어
  • npm outdated

    • 업데이트 할 수 있는 패키지가 있는지 확인
  • npm uninstall {패키지 이름}

    • 해당 패키지 제거
  • npm info {패키지 이름}

    • 해당 패키지의 세부 정보 조회
profile
Backend Engineer

0개의 댓글