유용한 툴 소개 - Nodemon 소개

유용한 툴 소개 - Nodemon 소개

2018, Oct 06    

오늘은 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"
    }
  ]