티스토리 뷰

노드를 더 우아하게 해주는 주변 프로그램인 npm 을 이해하도록 해보자. npm 은 Node.js Package Manager 로 단어 그대로 패키지 관리를 돕는다. 언뜻보면 python 의 pip 와 그 형상이 비슷해보이기도 한다. 하지만 npm 은 pip 처럼 패키지를 설치하는 기능을 포함하는 것으로 이해하는게 맞다. 이 장황한 이야기를 풀어내기 위해 API 서버를 노드 프로그램으로 만들어가며 이야기 하도록 하자. 우선 노드 프로젝트를 시작할 때 server.js 부터 만드는게 아니라 npm 을 이용해서 프로젝트를 생성한다.


$ npm init


이렇게하면 몇가지 문답을 거친후 디렉터리에 package.json 파일이 생성된다. 대략 가볍게 훑어보고 적당한 값을 입력하자. 빈 값으로 엔터를 입력하게되면 default 값으로 채워진다. 후에 변경할 수 있으니 적당히 넘어가면 된다.


$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (tmp)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/jybaek/serve/tmp/package.json:

{
  "name": "tmp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes


package.json 파일은 매우 특수하게 다뤄지는데 npm 을 이용해서 프로그램을 시작 할 수 있고 혹은 배포할 때도 사용된다. 파일의 내용은 아래에서 다시 다루도록 하고 일단 계속 진행하도록 하자. server.js 을 아래와 같이 코딩하도록 하자. 여기서 소스 내용을 이해할 필요는 없다. 지금 이 글은 npm 을 이해하기 위한 글이라는 것을 잊으면 안된다.


const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello World!\n');
    console.log('get request');
});

app.listen(6955, () => {
    console.log('server listening on port 6955');
});


이 상태로 프로그램을 구동시킬텐데 실행 명령어를 지정하기 위해서는 아래와 같이 package.json 을 수정해야 한다. npm 을 사용하지 않았더라면 node server.js 로 끝났을 것이지만 npm 을 사용한다는 것은 이를 훨씬 더 우아하게 만들어준다.


{
  "name": "serve",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC"
}


sciprts 라는 부분에 start 를 넣어주고 node 로 실행시킬 파일명을 명시해줬다. 이제 npm 명령어를 통해 노드를 실행시킬 수 있게 된 것이다.


$ npm start


코드에는 오류가 없지만 놀랍게도(!) 친절한 에러 메시지를 만날 수 있을 것이다. 에러 메시지를 살펴보면 express 라는 모듈이 설치되지 않았다는 것을 확인할 수 있다. 이제 python 의 pip 처럼 npm 을 사용해서 express 설치해주면 되겠다.


$ npm install express


install 뒤에는 설치할 모듈의 이름을 쓰게된다. 이렇게하면 node_module 디렉터리가 (없다면) 생성되고 그 밑에 express 관련된 파일들이 설치된 것을 확인할 수 있다. 하지만 노드 프로그램은 기본적으로 이 디렉터리를 포함시키지 않고 배포한다. 하물며 노드를 Git 으로 형상관리 할 때 node_module 디렉터리는 .gitignore 로 처리해버린다. 그렇다면 배포 후 처리는 어떻게 될까? 이때 필요한 옵션이 --save 이다.


$ npm install express --save


이렇게하면 package.json 파일에 express 의 내용이 기록된다 ( node 9.x 버전 이상부터는 옵션을 넣지 않아도 default 로 package.json 에 저장된다 ). 자, package.json 의 또 다른 기능이 나온다. 배포된 패키지에 아래 명령처럼 모듈을 생략한 상태로 npm 을 실행시키면 package.json 에 기록되어 있는 모든 모듈이 자동으로 설치된다.


$ npm install


배포는 이런식으로 된다. 모듈 삭제는 install 과 마찬가지로 uninstall 로 모듈 이름을 지정해주면 된다. 프로젝트에 모듈을 테스트하느라 이것저것 많이 설치되서 node_module 디렉터리가 지저분해졌다면 배포나 형상관리에 올릴 때는 반드시 uninstall 해주도록 하자. (package.json 에서도 함께 삭제 된다)


$ npm uninstall express


추가적으로 npm 에 아래 명령어를 익혀두면 좋다. 설치된 모듈을 tree 형태로 출력한다.


$ npm ls


https://www.npmjs.com/ 에서 pkg_name 을 검색한다. npm site 에서 조회하는 것과 유사하다


$ npm search pkg_name


https://www.npmjs.com/ 사이트 로그인과 동일하게 터미널에서 로그인


$ npm login


https://www.npmjs.com/ 사이트에서 계정 생성하는 것과 동일하게 터미널에서 계정 생성


$ npm adduser


https://www.npmjs.com/ 사이트에서 패키지에 upvote 개념의 star 를 주는 것과 동일


$ npm star pkg_name



댓글
댓글쓰기 폼