배경
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를 이용하여 개발하였습니다.
시작
여느 프로젝트와 같이 설치로 시작합니다
- sails를 설치를 하고
npm install -g sails
- sails프로젝트를 만들고
sails new projectname
- 시작합니다
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에 대한 환경을 분리하고 로그에 대해서는 실서버에서는 안나오게 되게끔 분리됩니다.