posted by 지니우스 2017. 5. 23. 23:30

> npm이란?

npm은 Node.js의 모듈을 관리하는 패키지 관리자다. 기본적으로 Node.js의 모듈을 설치하는 목적으로 사용된다. 그리고 Node.js로 만든 애플리케이션을 설치할 수도 있다.


> npm install 로 모듈 설치

그러면 npm의 기본적인 사용법을 알아보자. 모듈을 설치할 때에는 'npm install'을 사용한다. 커맨드 라인 창에서 다음과 같이 명령어를 입력한다.


[서식] npm으로 모듈 설치

$ npm install (모듈 이름)


예를 들면, 웹사이트로부터 파일이나 데이터를 내려받을 때에는 request 모듈을 많이 사용한다. request 모듈을 설치하기 위해서는 다음과 같이 입력하면 된다.


$ npm install request


그러면 다음과 같은 화면을 볼 수 있다.


▲ npm 실행 화면


위 화면에서 볼 수 있듯이 npm install을 실행하면 그 모듈에서 사용하는 다른 모듈(즉, 의존 모듈)도 같이 설치된다. 따라서 request 모듈을 사용하기 위해 mime-types 모듈과 form-data 모듈을 따로 설치하지 않아도 된다. 이것은 npm을 이용할 때의 커다란 장점으로 매우 편리한 기능이다.


- 모듈이 설치되는 경로

그러나 주의해야 할 점이 있다. 기본적으로 'npm install'로 모듈을 설치하면 이 명령을 실행한 현재 디렉터리에 모듈이 다운로드된다. 정확하게는 현재 디렉터리에 node_modules라는 디렉터리가 만들어지고, 그 안에 모듈이 다운로드된다.


그래서 한 번 모듈을 설치했어도 다른 디렉터리에 배치된 프로젝트에서는 그 모듈에 접근할 수 없다. 여기서 잠시 정리해 보자. 다음과 같은 디렉터리 구성으로 두 개의 프로그램이 있다고 하자.


+ <root>

|---+ <ProjectA>

|    |---+ <node_modules>

|    |--- program-a.js

|

|---+ <ProjectB>

|    |--- program-b.js 


<Project A>의 program-a.js에서 request 모듈을 사용하기 위해 Project A의 디렉터리에서 npm install request를 실행했다고 하자. 그러면 program-a.js에서는 request 모듈을 사용할 수 있게 된다. 그러나 Project B의 program-b.js에서는 request 모듈을 발견할 수 없으므로 Project B의 디렉터리에서 다시 request 모듈을 설치해야 하는 것이다.


- 글로벌 설치 -g

그러나 자주 사용되는 모듈을 매번 설치하는 것은 성가신 일이다. 모든 프로젝트 및 폴더에서 사용하고 싶다면 모듈을 설치할 때 -g 옵션을 붙인다. 그러면 글로벌한 경로에 모듈이 설치된다.


# 모듈을 글로벌하게 설치

$ npm install -g (모듈 이름)


-g 옵션을 붙여서 설치하는 것을 글로벌 설치라고 하고, 그렇지 않은 경우를 로컬 설치라고 한다. 글로벌 설치를 할 때의 주의점은 대부분의 환경에서 관리자 권한이 필요하다는 점이다. CentOS나 Mac OS X에서는 명령어 앞에 sudo를 붙여서 관리자 권한으로 명령을 실행할 수 있다.


# 관리자 권한으로 글로벌 설치

$ sudo npm install -g (모듈 이름)


sudo로 명령어를 실행하면 패스워드를 물어 보는데 이때 관리자 패스워드를 입력하도록 한다.

올바른 패스워드로 관리자 권한이 확인되면 관리자 권한으로 명령어가 실행된다.


- 글로벌 설치 시 PATH에 주의

npm을 통해 모듈을 글로벌하게 설치하면 CentOS5에서는 /usr/lib/node_modules에 설치된다. Mac OS X에 Homebrew로 설치한 경우에는 /usr/local/lib/node_modules에 설치된다. 어디에 모듈이 설치되는지는 다음 명령어로 확인할 수 있다.


# 글로벌 설치 경로 확인

$ npm root -g


그런데 npm으로 글로벌하게 설치한 모듈을 Node.js가 찾을 수 없다며 다음과 같은 에러 메시지가 표시되는 경우가 있다.


Error: Cannot find module '(모듈 이름)'


이것은 해당 모듈을 아직 설치하지 않았거나 Node.js에서 npm으로 글로벌하게 설치한 모듈을 찾을 수 없을 때 발생하는 에러 메시지다. 그렇다면 Node.js가 모듈을 찾을 때 어떤 경로를 검색할까? 다음 명령어를 통해 확인할 수 있다.


$ node -e "console.log(global.module.paths)"


CentOS에서는 다음과 같이 나타난다.


[ '/home/nodejs/node_modules',

  '/home/node_modules',

  '/node_modules' ]


잘 보면 현재 작업 디렉터리의 node_modules 폴더, 그리고 그 상위 폴더의 node_modules폴더, 다시 그 상위 폴더의 node_modules 폴더 .. 이러한 순으로 차례대로 모듈을 검색하는 것을 알 수 있다. 이와 별개로 Node.js는 환경 변수 NODE_PATH에 저장된 경로도 검색한다.


결론적으로, npm의 글로벌 모듈 설치 경로를 환경 변수 NODE_PATH에 등록하면 Node.js에서 모듈을 찾을 수 있게 된다.


다음은 가상 머신의 CentOS에서 'npm root -g'를 실행한 결과다.


$ npm root -g

/home/nodejs/.nvm/versions/node/v0.12.4/lib/node_modules


리눅스(CentOS)나 Mac OS X에서 환경 변수 값을 등록하려면 사용자의 홈 디렉터리에 있는 '~/.bash_profile'(가상 머신 환경에서는 '/home/nodejs/.bash_profile')을 편집한다. 다음과 같이 NODE_PATH에 npm의 글로벌 설치 경로를 지정한다.


# 환경 변수 NODE_PATH 설정

export NODE_PATH=/home/nodejs/.nvm/versions/node/v0.12.4/lib/node_modules



출처: 자바스크립트와  Node.js를 이용한 웹 크롤링 테크닉