본문 바로가기

개발 공부/nodejs

[섹션 4] npm

npm이란 Node Package Manager의 약자이다. 다른 사람들이 만들어놓은 라이브러리를 모아둔 저장소라고 보면 된다.

 

내가 개발에서 정말 마음에 들어하는 부분은 오픈소스가 잘 되어있다는 것이다. 예를 들어 나는 디자이너들과도 협업을 많이 하는데 거기는 저작권이라는 게 정말 빡세다. 법적인 저작권이야 물론 어떤 분야에서나 지켜져야 하겠지만 a가 동료 b의 디자인을 막 가져다 쓰는 것도 자존심 상하고 얼굴 붉히고 그런다.

 

 

 

 

 

반면 개발자는 뭔가 악의적이지 않다면 그런 경우가 잘 없다. 사실 그 두명 다 자기가 짠 코드가 아니라 구글링으로 긁어온 것이기 때문에 별 신경도 쓰지 않는다. 설령 자기가 짠 코드라도 오픈해놓는 경우가 많다. (개발자 특성이 그런 것일 수도 있겠다)

 

쨋든 그런 특성이 극대화된 것이 바로 이 npm이라고 볼 수 있겠다. 오픈 소스 생태계이고 npm install 명령어로 정말 이지하게 가져올 수 있다. 너무 다행 아닌가? 만약 이런 것도 없을 때에는 나같은 사람이 개발자한다는 건 상상도 못했을 것이다.

 

 

 

package.json

사용중인 패키지들은 package.json 파일에 기록된다. 보통 라이브러리명, 버전 이렇게 기록이 된다.

 

이외에도 프로젝트의 기본 정보들, 라이센스, dev dependency(개발 시에만 쓰이는 라이브러리들), 커멘드 등을 저장할 수 있다.

(개발용 라이브러리는 npm i -D 명령어를 사용)

 

그리고 실제로 패키지들이 저장되는 곳은 node_modules라는 곳이다.

 

 

 

node_modules

node_modules를 처음 봤을 때에는 왜 이름이 node_modules인지 몰랐다. 그냥 npm 설치하니까 생기는 애구나.. 싶었다. 그때는 npm이 뭔지도 잘 몰랐기 때문에 알 턱이 없었다.

 

지금와서 생각해보면 node는 모듈 단위로 나뉘고, npm의 첫글자인 n이 Node의 약자니까 node의 모듈들이 집합된 장소 였던 것이다. 그리고 여기에 파일이 생기는 기준은 package.json 기준이고.

 

이걸 모르고 프로그래밍에 문제가 생겼을 때 노드모듈즈 지우고 다시 깔아봐라~ 이 소리만 주입 들으니 뭔가 답답했다. 그런데 이번에 좀 해결이 되는 기분.

 

 

 

쨋든 node_modules는 git에 올리지 않는 대표적인 폴더 중 하나다. 용량이 크기 때문이다. '프로젝트에 기껏 해봐야 10개는 더 깔겠나? 왜 그렇게 용량이 큰데?' 라고 생각할 수도 있다.

 

답은 간단하다. 그 라이브러리를 만든 사람도 다른 라이브러리를 가져다가 만들었기 때문이다. 그리고 그 라이브러리도 다른 라이브러리를 가져다 쓰고 •••

 

그러다보니까 최종적으로 나는 a를 사용하려면 a를 만들기 위해 사용한 라이브러리들 그 아래 라이브러리들 다 깔아야 한다는 소리. 그래서 용량이 커지는 것이다.

 

이런 의존 관계들이 구체적으로 명확하게 기록 되어있는 곳이 pachage-lock.json이다.

 

 

 

글로벌 패키지

npm i -g 명령어를 쓰면 전역 설치를 할 수 있다. 그런데 요즘은 전역 설치를 잘 안하는 추세이다. package.json에 남지 않아서 다른 사람이 쓸때 애먹을 수 있기 때문.

 

그래서 나온 것이 npx 명령어이다. 이 명령어는 글로벌로 설치를 하지 않은 패키지도 명령어처럼 사용할 수 있게 해준다.

 

npx create-react-app test-app 이런 명령어를 프론트할 때 매주 썼었다.

 

 

 

SemVer 버저닝

Major, Minor, Patch로 나뉘는 버전 표기 방식이다. 

 

 

노드는 배포를 할 때 한글자라도 달라지면 버전을 올려야 한다. patch는 간단한 수정 혹은 버그를 잡았을 때 올리고, Minor은 하위 버전에 문제가 되지 않는 수정 사항이 해결되면 올린다. Major은 하위 버전에 호환이 되지 않을정도로 큰 업데이트가 있을 시에 올리게 된다.

 

 

 

package.json에 보면 버전 앞에 요상한 기호들이 붙어있는 것을 볼 수 있다.

 

"devDependencies": {
  "nodemon": "^2.0.15"
}

 

^: 패키지 업데이트 시에 minor 버전까지만 업데이트 된다는 뜻이다. 2.1.12 라면 2버전 안에서만 올리겠다는 뜻.

~: 패키지 업데이트 시에 patch 버전까지만 업데이트 된다는 뜻이다. 그런데 사실 이건 굳이 의미가 있나싶다. 어차피 오류가 나지 않으면 더 최신 것을 쓰는 게 좋지 않을까?

@latest: next를 설치할 때 주로 사용하는데 최신 버전을 설치하라는 뜻이다. 자매품으로 @next가 있는데 아직 실험 버전인 것들을 설치할 수 있는 명령어이다. 실험 버전인만큼 불안정하다고 볼 수 있다.

 

 

 

기타 명령어

npm outdated: 어떤 패키지에 기능 변화가 생겼는지 알 수 있다. 가끔 내가 업데이트를 너무 안해서 의존성에 문제가 생기기도 하는데 이 명령어로 주기적으로 체크해주는 것도 좋은 방법이겠다.

 

npm search: npm 패키지를 검색할 수 있다. 사실 이건 웹에서 하는 게 더 좋아보인다.

 

npm deprecate [패키지명][버전] [메시지]: 패키지를 설치할 때 경고 메시지를 띄운다. 오류가 있거나 지원 중단 방식이라거나 할 때 쓴다. react 할 때 아주 가끔 본 것 같다. 주로 패키지를 만드는 사람들이 쓸 명령어

 

npm publish: 패키지를 배포할 때 사용하는 명령어 이렇게 입력하면 기타 정보들을 입력하는 칸이 나온다. 패키지 배포는 72시간 이내에 해야하며 npm unpublish 명령어로 삭제 가능하다.