최근 개인적으로 API서버를 만들 일이 있어서 뭘로 해볼까 하다가 이 놈으로 정했는데요. 일단 가볍게 써 본 결과로는 만족합니다. 기존 NodeJS에서 인기 있었던 WebFramework인 Express보다 더 맘에 드네요. 사실 요즘 MVC Framework는 다 잘 되어 있어서 어떤 걸 써도 다 만족하겠지만요.

Nodejs를 좋아하는 게 일단 웹개발을 많이 해봐서 Javascript가 좀 익숙하기도 하고, npm이라는 것이 있어서 손쉽게 설치할 수 있는 게 좋더라구요. 하지만, 콜백 지옥에 빠지면 답이 없긴함 ㄷㄷ 아직 언어를 익숙하게 잘 짜지 못하는 것이기도 하지만요ㅠ

그렇게 NodeJS용 Framework를 찾다보니 Sails라는 것을 찾게 되었네요.


http://sailsjs.org/#/


1. Sails 특징

모델과 컨트롤러 파일만 만들어도 자동으로 RestAPI를 만들어줍니다. BluePrint라는 것이 그렇게 하는 것 같은데, 처음엔 우와!!! 하는데, 사실 그대로 쓰이는 API는 거의 없죠. 나중에 분명 수정해야할 겁니다-_- 기본적인 CRUD를 코드 한 줄 없이 가능하게 해요.

ORM같은 것을 지원합니다(Waterline이라는 것!). 모델파일만 잘 작성하면 테이블도 직접 만들어줍니다. 모델 관계도 잘 지정하면 테이블끼리 외래키로 잘 연결해줍니다. 

다양한 DB를 제공하네요. MySQL, MongoDB, PostgreSQL, Redis, local disk 등을 제공하는데, 모델은 똑같이 사용이 가능한 것 같아요. 일단 저는 MySQL로 밖에 하지 않아서...

WebSocket을 쉽게 쓸 수 있어요. 그냥 프레임워크에 포함이 되어 있어요.

보안적인 면을 신경을 많이 썼더라구요. 웹은 개발하면서도 보안에 취약해지기에 마련인데, 최대한 놓치지 않으려고 많은 장치를 해놨어요. Cross-Origin Resource Sharing (CORS), Cross-site request forgery (CSRF) 등등 옵션들을 제공하고 있어요. 

커맨드라인 제너레이터도 제공을 해요. 간단히 테스트해볼 것은 console로 가능하고, 모델, 컨트롤러, API 생성기를 제공해요.

그 외에 레일즈처럼 asset compile도 하고, test도 쉽게 할 수 있으며, 웹프레임워크의 기본적인 것들인 국제화 처리, 라우터, 업로드, 뷰레이아웃 기능들을 제공하고 있습니다.


2. 또 다시 나온 소녀시대 스케줄 예제

설명하는 것보다 그냥 예제로... 간단하게 MySQL이랑 연동해서 DB데이터를 연결해서 뿌려주는 예제를 만들겠습니다. 모델도 소녀시대와 스케줄은 1:N으로 테이블 설계를 하겠습니다.

2-1. Sails설치

당근 Node.js와 npm이 설치가 되어 있다는 가정하에....(아래 링크에 참조를...)
http://sailsjs.org/#/getStarted

sails는 글로벌 옵션을 줘서 실행해서 언제 어디서든 프로젝트를 만들 수 있게 합니다.

npm install -g sails


2-2. Sails 프로젝트 생성

sails new 프로젝트명 쓰면 레일즈처럼 필요한 파일들을 미리 만들어줍니다.

sails new sosi-schedule-sails


2-3. 데이터 베이스 설정

npm으로 sails-mysql을 설치해야 합니다. package.json파일에 추가하는 게 차후에 배포할 때 좋습니다.

"dependencies": {
    .
    .
    "sails-mysql": "latest"
  }

그리고 

npm install

그러면 설치가 됩니다.

설정을 해야 하는데, config/connection.js파일을 보면 DB정보를 입력할 수 있습니다. someMysqlServer라고 되어 있는 부분이 있는데, 이걸 myMysqlServer로 바꾸죠. 내꺼니깐염. 그리고 디비정보를 입력하면 됩니다(아 내껀 MariaDB인데도 잘 되네요...).

config/connections.js

myMysqlServer: {
    adapter: 'sails-mysql',
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'sosi'
  },

그러면 기본 커넥션을 바꿔줘야하는데요. config/model.js를 열면, 기본적으로 커넥션을 어떤 것을 맺을 지 지정할 수 있습니다. 물론 모델별로 다른 커넥션을 맺을 수 있습니다. 모델별로 커넥션을 다르게 지정하면 됩니다. 일단 나는 디비가 하나니깐염.

config/models.js

module.exports.models = {
  connection: 'myMysqlServer',
  migrate: 'drop'
};

여기서 connection 이름은 우리가 지정한 내마이에스큐엘서버를 그대로 써주면 됩니다. 밑에 migrate는 뭐냐! 3가지 종류가 있는데염. 

drop: 서버를 죽였다가 다시 띄울 때마다 테이블을 다시 날려버리는 옵션입니다. 개발할 때 좋겠죠?
alter: 서버를 죽였다가 다시 띄울 때 모델에 칼럼의 변경사항을 체크해서 업데이트 해주는 옵션이고, 데이터를 살아있습니다. 이 옵션은 아직 실험적(experimental)인데요. 제가 데이터를 좀 많이 넣고 서버를 띄워보니 띄울 때마다 뭔가 알터를 하는지 서버 뜨는데 오래걸리는 현상이 발생합니다. 아직 문제가 많은 듯합니다.
safe: 서버를 죽였다가 다시 띄워도 아무것도 하지 않습니다.

적절히 골라쓰세요~


2-3. API 생성

sails는 자동으로 API를 생성해줍니다. API생성은 Model+Controller입니다. 물론 따로 생성할 수도 있습니다. API가 소녀시대 정보를 내려주는 SosiAPI와 스케줄 정보를 내려주는 ScheduleAPI를 생성합니다. 제너레이터를 이용하면 쉽게 생성할 수 있습니다. 근데 보면 사실 그냥 파일만 만들어주는거임-_-

sails generate api sosi
info: Created a new api!
sails generate api schedule
info: Created a new api! 

그러면 controllers/SosiController.js, models/Sosi.js, controllers/ScheduleController.js, models/Schedule.js가 생성이 되었습니다.

2-4. 모델 설정

모델에 attributes를 지정합니다. 여기서 One-to-Many방식으로 설정할 수 있습니다.

models/Sosi.js

module.exports = {

  attributes: {
    name: {
      type: 'string'
    },
    schedules: {
      collection: 'schedule',
      via: 'sosiId'
    }
  }
};

attributes는 말그대로 속성값(디비에서 칼럼값이지요). name이라는 속성이고 타입은 스트링임. 그리고 소녀시대는 스케줄이라는 배열을 가지게 되니 schedules로 지정하고, collection값은 스케줄, via는 sosiId(schedule의 속성값입니다)로 지정합니다. 

models/Schedule.js

module.exports = {

  attributes: {
    program: {
      type: 'string'
    },
    sosiId: {
      model: 'sosi'
    }
  }
};


2-5. 기본값 넣기 

drop방식이니까 기본적으로 서버 뜰 때 값을 넣고 시작할 수 있어요. bootstrap.js부분에 넣으면 서버가 시작할 때 실행이 되어요. 소녀시대 멤버들을 넣어볼게요.

config/bootstrap.js

Sosi.create({name: '태연'}).exec(console.log);
Sosi.create({name: '윤아'}).exec(console.log);
Sosi.create({name: '수영'}).exec(console.log);
Sosi.create({name: '효연'}).exec(console.log);
Sosi.create({name: '유리'}).exec(console.log);
Sosi.create({name: '티파니'}).exec(console.log);
Sosi.create({name: '써니'}).exec(console.log);
Sosi.create({name: '서현'}).exec(console.log);


2-6. 서버 실행

sails lift


2-7. API 잘 동작하는지 확인

기본적으로 BlueprintAPI를 제공하기 때문에 디비를 그대로 읽고 쓸 수 있는 url이 존재합니다. 

소녀시대 정보를 가져오려면 
http://localhost:1337/sosi/1 

스케줄 정보를 넣으려면 뭐 post도 되는데, get으로도 됩니다.
http://localhost:1337/schedule/create?program=무한도전&sosiId=1

다시 소녀시대 정보를 불러오면....

우오오 잘된다!

ps. 모바일앱 하나 만드려고 하는데....취약한 앱개발 공부는 안하고.....암튼, 뭐 맘에드는 프레임워크인데, 더 써봐야 알겠네요.

 
Posted by 머드초보
,