유용한 툴 소개 - Nodemon 소개
오늘은 node.js 개발시에 생산성을 up시켜줄 유용한 툴을 소개하려 합니다.
Nodemon
nodemon 은 node.js 서버 개발시에 소스코드에 수정이 있을 경우, 자동으로 서버를 다시 시작해주는 툴입니다.
단순한 기능이지만, 실제 개발환경에서 사용해보면 생산성이 크게 향상되는 것을 느낄 수 있습니다.
설치 & 간단한 사용법
$ npm install -g nodemon
혹은
$ npm install --save-dev nodemon
사용법도 사실 별다를 것이 없이 node 를 사용하는 것과 동일하게 생각하면 됩니다.
만약 node 서버의 시작점이 node index.js
라면,
nodemon 의 경우는 nodemon index.js
가 됩니다.
디버깅의 경우도 마찬가지 입니다.
node 디버깅 서버 start 예) node --inspect index.js 80
nodemon 디버깅 서버 start 예) nodemon --inspect index.js 80
간단한 웹서버로 테스트 해 보겠습니다.
index.js 파일을 작성합니다.
var http = require('http')
http.createServer((req, res) => {
res.write('hello world')
res.end()
}).listen(8000)
파일이 있는 디렉토리에서 nodemon 실행
$ nodemon index.js
[nodemon] 1.18.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node app.js`
서버의 코드를 수정해서 서버가 자동으로 다시시작하는 것을 확인합니다.
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
만약 수동으로 서버를 다시 시작하고 싶은 경우에도 서버를 끄고 다시 시작할 필요가 없습니다.
서버가 실행된 상태에서 rs <enter>
입력으로 서버를 바로 다시 시작할 수 있습니다.
rs
[nodemon] starting `node app.js`
구체적인 설정
nodemon 은 현제 working directory 에 nodemon.json 파일을 추가하거나 package.json 파일에 설정을 통합할 수 있습니다.
package.json 파일에 설정할 경우 아래와 같이 nodemonConfig
키를 추가해 설정할 수 있습니다.
{
"name": "nodemon",
"homepage": "http://nodemon.io",
"...": "... other standard package.json values",
"nodemonConfig": {
"ignore": ["test/*", "docs/*"],
"delay": "2500"
}
}
nodemon 의 default 설정으로 현재 디렉토리의 *.js 파일을 모니터링 합니다. 때문에 특정파일이나 폴더를 감시 대상에서 제외 혹은 추가하거나 하는 경우에 설정해 줄 수 있습니다.
VSCODE 에서 NODEMON 으로 디버깅 하기
VSCODE 의 launch.json
파일을 아래와 같이 설정합니다.
기존의 node.js 어플리케이션을 vscode 에서 디버깅 할때와 달리 vscode 디버깅 콘솔이 아닌 터미널에서 실행 하게 됩니다. debug 콘솔을 사용하게 되면 nodemon 이 재시작 되면서 런타임 프로세스가 끊어지는 현상이 발생하기 때문입니다.
또한 런타임 프로세스에서 실행되는 nodemon 을 디버깅 하는 것이기 때문에 nodemon 설치시 npm install -g nodemon
으로 글로벌로 설치해야 합니다.
"configurations": [
{
"type": "node",
"request": "launch",
"name": "nodemon",
"runtimeExecutable": "nodemon",
"program": "${workspaceFolder}/index.js",
"restart": true,
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]