[nodejs] sailsjs로 웹서비스 만들기 개요 + 환경설정

배경

nodejs를 이용한 웹 프로그래밍을 시작하며 가장 먼저 접하게 되는 것은 아마도 express.js 일것입니다.
여러 사람들이 expressjs프레임워크의 장점으로 뽑는다면 높은 자유도, 즉 가장 기본적으로 세팅되어 있는 점을 뽑을 듯합니다.

반대로 sailsjs는 웹서비스를 준비하며 필요한 요구사항들을 여럿 담고 있습니다.

  • waterline 이라는 자체적인 database orm부터
  • 다국어를 위한 i18n, task관리인 grunt,
  • restful test를 하는 supertest,
  • 제가 잘 사용하지 못하지만 빠르고 정교한 개발을 가능케하는 blueprint를 활용하고,
  • 많이 사용하는 유틸 라이브러리인 async, lodash 등도 사용합니다.

sailsjs프로젝트의 structure 또한 좀더 정규화 되어 있어 구조에 대한 고민이나 추가적인 설정 또한 해준다는 장점이 있습니다.
실제로 업무에서 구현되어었던 express에서 추가로 개발한것들에 대하여 대신하여 편리하고 좀 더 빠른 개발을 가능하게 했습니다.
sailsjs app structure

config폴더를 보시면 전처리를 위한 bootstrap, 환경 분리를 위한 env/(development,production), db커넥션을 위한 connectionjs, log처리 등 모든 것들이 준비되어있습니다.

위와 같은 이유로 친구가 필요로 하는 작은 서비스를 빠르게 개발 하기 위해 sailsjs를 이용하여 개발하였습니다.

시작

여느 프로젝트와 같이 설치로 시작합니다

  1. sails를 설치를 하고

    npm install -g sails

  2. sails프로젝트를 만들고

    sails new projectname

  3. 시작합니다

    cd projectname
    sails lift

nodemon 연동

grunt config 설정에 대한 세팅들은 tasks/config에 설정을 합니다.

우선 grunt-nodemon을 설치해주고

npm install –save-dev grunt-nodemon

task에 대한 설정을 해줍니다.

//tasks/config/nodemon.js
module.exports = function (grunt) {
  grunt.config.set('nodemon', {
    dev: {
      script: '../../app.js',
      options: {
        args: ['dev', "--models.migrate='drop'"],
        nodeArgs: ['--debug'],
        callback: function (nodemon) {
          nodemon.on('log', function (event) {
            console.log(event.colour)
          })
        },
        cwd: __dirname,
        ignore: ['node_modules/**'],
        ext: 'js',
        watch: ['../../api', '../../config'],
        delay: 1000,
        legacyWatch: true
      }
    },
    exec: {
      options: {
        exec: 'less'
      }
    }
  })

  grunt.loadNpmTasks('grunt-nodemon')
}

이후 tasks/register에 tssk를 작성합니다

//tasks/register/dev
module.exports = function (grunt) {
  grunt.registerTask('dev', ['nodemon'])
}

이제

grunt dev

를 실행하여 nodemon을 적용합니다.

config설정하기

기본적으로 config디렉토리 아래 작성되어 있는 파일들이 공통으로 사용하는 설정을 하게 되고,
env 폴더 아래 development, production으로 나누어 환경을 분리 할 수 있습니다.

예로 저 같은 경우는 로컬에서 개발할 경우 데이터베이스를 사용하기 힘든 환경이기 때문에

  • 로컬에서는 sails-disk라는 로컬파일로 저장하여 db를 사용하게 하는 것을 사용할것이고
  • 실사용에서는 mysql를 사용할 것이라면

connections.js에 두가지 모두 선언을 해주고

//config/connections.js
  localDiskDb: {
    adapter: 'sails-disk'
  },
  mysqlServer: {
    adapter: 'sails-mysql',
    host: 'YOUR_MYSQL_SERVER_HOSTNAME_OR_IP_ADDRESS',
    user: 'YOUR_MYSQL_USER', //optional
    password: 'YOUR_MYSQL_PASSWORD', //optional
    database: 'YOUR_MYSQL_DB' //optional
  }

각각의 환경에 대해서

//config/env/development.js
models: {
  connection: 'localDiskDb'
},
log: {
  level: 'info'
}
//config/env/production.js
models: {
  connection: 'mysqlServer'
},
log: {
  level: 'silent'
}

로 작성하게 된다면, db에 대한 환경을 분리하고 로그에 대해서는 실서버에서는 안나오게 되게끔 분리됩니다.