티스토리 뷰
노드를 더 우아하게 해주는 주변 프로그램인 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
'개발 > Node.js' 카테고리의 다른 글
노드를 더 우아하게. nvm 이야기 (0) | 2018.06.07 |
---|---|
비동기 교통정리 - async.waterfall (6) | 2018.06.04 |
콜백(callback) 개념 이해하기 (0) | 2018.03.26 |
pm2 모듈을 부트 스크립트로 등록하기 (0) | 2018.03.16 |
노드를 더 우아하게. pm2 이야기 (16) | 2018.03.07 |
- Total
- Today
- Yesterday