npm
세상에는 무수히 많은 자바스크립트 프로그래머가 있다. 그런 사람들이 미리 작성해놓은 코드들도 있다.
그리고 이를 공개해 놓은 코드도 많다. 우리는 이런 코드들을 잘 사용할 줄 알아야 한다.
이런 코드들이 공개되어 있는 서버인 npm을 알아보자.
npm은 Node Package Manager의 약어로, 이름 그대로 노드 패키지 매니저이다.
대부분의 자바스크립트 프로그램은 패키지라는 이름으로 npm에 등록되어있고 특정 기능을 하는 패키지가 필요하면 npm에서 찾아 설치하면 된다.
npm에 업로드된 노드 모듈을 패키지라고 부르며 패키지가 다른 패키지를 사용할 수도 있다. 이런 관계를 의존 관계라고 부른다.
package.json
서비스에 필요한 패키지를 하나씩 추가하다 보면 어느새 패키지 수가 100개를 훌쩍 넘어버리게 된다.
그리고 사용할 패키지는 저마다 고유한 버전이 있으므로 어딘가에 기록해두어야 한다.
같은 패키지라도 버전별로 기능이 다를 수 있으므로 프로젝트를 설치할 때 패키지도 동일한 버전으로 설치하지 않으면 문제가 생길 수 있다. 이때 설치한 패키지의 버전을 관리하는 파일이 바로 package.json이다.
npm init
명령어로 package.json을 만드는 명령어를 제공한다.
{
"name": "node",
"version": "1.0.0",
"description": "Study_node",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/minhvvan/Study_node.git"
},
"author": "GR8",
"license": "ISC",
"bugs": {
"url": "https://github.com/minhvvan/Study_node/issues"
},
"homepage": "https://github.com/minhvvan/Study_node#readme"
}
scripts 부분은 npm 명령어를 저장해두는 부분이다. 콘솔에서 npm run [스크립트 명령어]를 입력하면 해당 스크립트가 실행된다. 보통 start 명령어에 node [파일명]을 저장해 두고 npm start로 실행한다.
이제 패키지들을 설치해보자.
npm install express
메시지 중에 WARN이 나오는데 걱정하지 않아도 된다.
{
"name": "node",
"version": "1.0.0",
"description": "Study_node",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/minhvvan/Study_node.git"
},
"author": "GR8",
"license": "ISC",
"bugs": {
"url": "https://github.com/minhvvan/Study_node/issues"
},
"homepage": "https://github.com/minhvvan/Study_node#readme",
"dependencies": {
"express": "4.17.1"
}
}
dependencies에 express가 설치된 것을 볼 수 있다.
추가로 node_modules라는 폴더도 생성되었다. 그 안에 설치된 패키지들이 들어 있다. 분명히 Express 하나만 설치했는데 패키지가 여러 개 들어 있다. 이는 Express가 의존하는 패키지들이다.
package-lock.json이라는 파일도 생성되었다. 내용을 보면 직접 설치하한 express 외에도 node_modules에 들어 있는 패키지들의 정확한 버전과 의존 관계가 담겨 있다.
개발용 패키지를 설치할 수도 있다. 실제 배포 시에는 사용되지 않고 개발 중에만 사용되는 패키지들이다.
npm install --save-dev [패키지]로 설치한다.
npm에는 전역(global) 설치 옵션도 있다. 패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더에 설치한다. 전역 설치를 했다고 패키지를 모든 곳에서 사용한다는 뜻은 아니다.
패키지 버전 이해
노드 패키지들의 버전은 항상 세 자리로 이루어져 있다. 심지어 노드의 버전도 세 자리이다.
버전이 세 자리인 이유는 SemVer 방식의 버전 넘버링을 따르기 때문이다.
SemVer는 Semantic Versioning(유의적 버전)의 약어이다. 버전을 구성하는 세 자리가 모두 의미를 가지고 있다는 뜻이다. 각각의 패키지는 모두 버전이 다르고 패키지 간의 의존 관계도 복잡하다. 만약 어떤 패키지의 버전을 업그레이드했는데, 그것을 사용하는 다른 패키지에서 에러가 발생한다면 문제가 된다. 따라서 버전 번호를 어떻게 정하고 올려야 하는지를 명시하는 규칙이 등장했다.
버전의 첫 번째 자리는 major버전이다. major 버전이 0이면 초기 개발 중이라는 뜻이다. 1부터는 정식 버전을 의미한다. majir 버전은 하위 호환이 안 될 정도로 패키지의 내용이 수정되었을 때 올린다. 예를 들어 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 버전을 올린다.
새 버전을 배포한 후에는 그 버전의 내용을 절대 수정하면 안 된다. 만약 수정 사항이 생기면 major, minor, patch 버전 중 하나를 의미에 맞게 올려서 새로운 버전으로 배포해야 한다.
기타 npm 명령어
npm으로 설치한 패키지를 사용하다 보면 새로운 기능이 추가되거나 버그를 고친 새로운 버전이 나올 때가 있다.
npm outdated 명령어로 업데이트할 수 있는 패키지가 있는지 확인할 수 있다.
npm search [검색어]로 npm 패키지를 검색할 수 있다.
npm info [패키지명]은 패키지의 세부 정보를 파악하고자 할 때 사용하는 명령어이다.
npm adduser는 npm 로그인을 위한 명령어이다. npm 공식 사이트에서 가입한 계정으로 로그인하면 된다.
npm whoami는 로그인한 사용자가 누구인지 알린다.
npm logout은 npm adduser로 로그인한 계정을 로그아웃할 때 사용한다.
npm version [버전] 명령어를 사용하면 package.json의 버전을 올린다.
npm deprecate [패키지명] [버전] [메시지]는 해당 패키지를 설치할 때 경고 메시지를 띄우게 하는 명령어이다.
npm publish는 자신이 만든 패키지를 배포할 때 사용한다.
npm unpublish는 배포한 패키지를 제거할 때 사용한다.
npm ci는 package.json 대신 package-lock.json에 기반하여 패키지를 설치한다. 더 엄격하게 버전을 통제하여 패키지를 설치하고 싶을 때 사용하면 된다.
패키지 배포하기
npm publish 명령어를 사용하여 패키지를 배포할 수 있다.
패키지 이름이 겹치는 것을 허용하지 않으니 유니크한 이름으로 설정해야 한다.