5. npm? 실행 명령어 아니야?

최상민·2023년 5월 6일
0

Node.js 교과서

목록 보기
5/9
post-thumbnail

패키지 매니저 npm

나처럼 node.js를 구글링이나 유튜브를 통해 따라하며 배운 사람들은 npm init, npm install 등 npm이 무엇인지 모르고 터미널에서 npm을 입력해본 경우가 대부분이라고 생각한다.

물론 나도 그저 실행 명령어라고 생각했었다.

이제 npm이 무엇인지 확실하게 한 번 알아보도록 하자.

npm은 Node Package Manager의 약어로, 이름 그대로 노드 패키지 매니저를 의미한다.

1장에서 노드는 자바스크립트 프로그램을 컴퓨터에서도 실행할 수 있게 해주는 런타임이라고 했었다.

대부분의 자바스크립트 프로그램은 패키지라는 이름으로 npm에 등록되어 있으므로 특정 기능을 하는 패키지가 필요하다면 npm에서 찾아 설치하면 된다.

npm에는 세계 최대 규모로 방대한 양의 패키지들로 이루어져 있으며, 대부분 오픈 소스여서 노드를 사용해 웹을 개발할 때 많은 도움을 준다.

npm에 업로드된 노드 모듈을 패키지라고 부르며, 모듈이 다른 모듈을 사용할 수 있는 것처럼, 패키지가 다른 패키지를 사용할 수도 있는데, 이런 관계를 의존 관계라고 한다.

package.json

필요한 패키지를 여러개 추가하다보면 엄청 많아질거고, 사용할 패키지는 고유한 버전이 있으므로 항상 기록해둬야한다.

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

항상 노드로 프로젝트를 만들 때 가장 먼저 하던 npm init이 바로 package.json을 만드는 명령어이다.

터미널에 npm init을 적으면 항목이 하나씩 나오게되는데 하나씩 알아보자.

  • package name: 패키지의 이름. package.json의 name 속성에 저장됨.
  • version: 패키지의 버전.
  • entry point: 자바스크립트 실행 파일 진입점. 보통 마지막으로 module.exports를 하는 파일을 지정함. package.json의 main 속성에 저장됨.
  • test command: 코드를 테스트할 때 입력할 명령어를 의미함. package.json scripts 속성 안의 test 속성에 저장됨.
  • git repository: 코드를 저장해둔 깃(git) 저장소 주소를 의미함. package.json의 repository 속성에 저장됨.
  • keywords: npm 공식 홈페이지에서 패키지를 쉽게 찾을 수 있게 함. package.json의 keywords 속성에 저장됨.
  • license: 해당 패키지의 라이선스

위 생성과정을 모두 마치고나면 package.json이 생성되어있다.

scripts 부분은 npm 명령어를 저장해두는 부분이며, 여러 개를 등록해두고 사용할 수 있다.
콘솔에서 npm run [스크립트 명령어]를 입력하면 해당 스크립트가 실행된다.

예를 들어 npm run test를 입력하면 echo "Error: no test specified" && exit 1이 실행되고, echo "Error: no test specified"는 콘솔에 해당 문자열을 출력하라는 뜻이고, exit 1은 에러와 함께 종료하라는 뜻이다.

이제 패키지를 기록할 package.json을 만들었으니 패키지를 다운받아보자.

터미널에 npm install [패키지 이름]을 입력하여 다운받을 수 있는데, 다음 장에서 사용할 express를 npm install express를 입력하여 다운받아보았다.

아까 package.json에서 dependencies라는 속성이 추가된 것을 볼 수 있는데, 이 부분에 설치한 패키지 버전이 저장된다. 추가로 node_modules라는 폴더와 package-lock.json 파일이 동시에 생성되었는데, 그 안에 설치한 패키지들이 들어있다.

위에서 패키지는 서로 의존 관계를 가지고 있다고 했는데, node_modules 폴더에 express가 의존하는 패키지들이 들어있고, 그 패키지들이 의존하는 패키지가 또 들어있고... 이런 식이다.

이런 의존 관계의 패키지들은 package-lock.json이라는 파일에 버전과 의존 관계가 담겨있다.

package.json - 직접 설치한 패키지를 기록하는 파일
package-lock.json - 패키지 간의 의존 관계를 명시한 파일

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

서버는 소스 코드가 바뀔 대마다 껏다 켜줘야하는데, 이를 자동으로 재실행해주는 패키지인 nodemon을 개발자 패키지로 설치해보자.

npm install -dev nodemon

따로 "devDependencies"라는 속성이 추가되며, nodemon이 입력되었다.

※ npm install 명령어는 npm i로 줄여쓸 수 있으며, -dev는 -D, -global은 -g로 줄여 쓸 수 있다.

패키지 버전 이해하기

노드와 노드 패키지들의 버전은 SemVer 방식의 버전 넘버링을 따르기 때문에 항상 세 자리로 이루어져 있다.

SemVer이란? Semantic Versioning(유의적 버전)의 약어이다. 버전을 구성하는 세 자리가 모두 의미를 갖고 있다는 뜻이다.

세 자리중 첫 번째는 메이저(Major) 버전이다.

메이저 버전이 0이면 초기 개발 중이라는 뜻이고, 1부터는 정식 버전을 의미한다. 메이저 버전은 하휘 호환이 안 될 정도로 패키지의 내용이 수정되었을 때 올린다.

두 번째 자리는 마이너(Minor) 버전이다.

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

세 번째 자리는 패치(Patch) 버전이다. 새로운 기능이 추가되었다기보다는 기존 기능에 문제가 있어 수정한 것을 내놓았을 때 패치 버전을 올린다.

새 버전을 배포한 후에는 그 버전의 내용을 절대 수정하면 안되며, 만약 수정 사항이 생기면 메이저, 마이너, 패치 중 하나를 의미에 맞게 올려서 새로운 버전으로 배포해야 한다.

package.json에는 세 자리 숫자 이외에도 ^이나 ~ 또는 >, < 같은 문자를 볼 수 있다.
이 문자는 버전에는 포함되지 않지만 설치하거나 업데이트할 때 어떤 버전을 설치해야 하는지 알린다.

^는 마이너 버전까지만 설치하거나 업데이트한다. 예를들어, npm i express@^1.1.1 이라면 1.1.1 이상 2.0.0 미만 버전까지 설치된다.

~는 패치 버전까지만 설치하거나 업데이트한다. npm i express@~1.1.1 이라면 1.1.1 이상 1.2.0 미만 버전까지 설치된다.

<, >, >=, <=, =은 초과, 미만, 이상, 이하와 동일한 뜻을 가진다.

npm install, npm init을 제외하고 많은 명령어가 있는데 npm 공식 문서에서 확인할 수 있다.

profile
기록으로 복습하자

0개의 댓글

관련 채용 정보