...
sequelize-auto 모듈
[sequelize-cli]
- 데이터베이스가 구축되지않더라도, 프로젝트만 받아서 설정하고 서버실행만 하면 알아서 데이터베이스 테이블 생성해주는 라이브러리이다.
- 누군가의 프로젝트를 받아서 빠르게 was환경을 돌릴상황이면 좋은 선택지다.
- 모델 코드 작성 → 자동 create문 변환 → RDB 테이블 생성
[sequelize-auto]
- 데이터베이스를 이미 구축한 상태라면, 쓸모있는 라이브러리다.
- 이미 구축된 데이터베이스 스키마를 바탕으로 orm 모델을 자동으로 생성해준다.
- 힘들게 sql짜고 orm코딩 하는 두번의 번거로움을 없애준다.
- 이미 짜여진 테이블을 기반으로 → 자동으로 모델 코드 생성
sequelize-auto 설치
Sequelize-auto는 Sequelize cli와 반대로, model을 먼저 작성하지 않고, 디비를 먼저 작성한 후에 실행해주면,
디비정보가 모델에 역으로 저장된다.
하지만 sequelize-auto로 연동할 경우 created_at, update_at, defaultValue를 직접 설정해줘야 한다. 하지만 workbentch에서 테이블 간의 관계를 잘 만들어놓았으면 auto가 관계까지 잘 가져와 편안하게 코딩 할 수 있다.
$ npm i sequelize-auto
sequelize-auto 사용
만일 MySQL에 이미 다음과 같은 테이블이 생성되어있다고 가정하자.
원래대로라면 이 테이블 정보를 기반으로 모델 코드를 그대로 짜야되지만 auto 모듈을 통해 자동으로 모델을 생성하고 Node와 MySQL을 연결하는 코드도 생성할 것이다.
모델 자동생성 클래스 작성
우선 orm.js라는 파일을 만들어주고 안에다가 sequelizeAuto 생성 클래스 구문을 기재하자.
클래스 인자는 다음과 같이 구성되어있다.
처음에는 데이터베이스명, 유저, 비번을 쓰고 그다음 정보를 담은 객체를 적어주면 된다.
orm.js
const SequelizeAuto = require('sequelize-auto');
const auto = new SequelizeAuto("nodejs", "root", "123123", {
host: "127.0.0.1",
port: "3306",
dialect: "mysql",
//noAlias: true // as 별칭 미설정 여부
}
);
auto.run((err)=>{
if(err) throw err;
})
그리고 orm.js를 노드로 실행하면 다음 로그와 함께 models 디렉토리에 모델이 자동 생성된다.
$ node orm
mysql의 comments테이블과 users테이블이 각각 comments.js와 users.js모델로 변환될걸 확인 할 수 있다.
init-models.js는 각각 생성된 모델들의 관계를 설정하고 데이터베이스를 잇는 역할을 한다고 보면된다. 이 역시 자동 생성 된다.
init-models.js
var DataTypes = require("sequelize").DataTypes;
var _comments = require("./comments");
var _users = require("./users");
function initModels(sequelize) {
var comments = _comments(sequelize, DataTypes);
var users = _users(sequelize, DataTypes);
// 관계를 정의하는걸 알수 있다.
comments.belongsTo(users, { as: "commenter_user", foreignKey: "commenter"});
users.hasMany(comments, { as: "comments", foreignKey: "commenter"});
return {
comments,
users,
};
}
module.exports = initModels;
module.exports.initModels = initModels;
module.exports.default = initModels;
mysql 데이터 가져오기
index.js에서 sequelizeAuto로 만든 모델과 mysql 테이블을 서로 연결 시켜주고 리턴한 models객체를 export한다.
그리고 app.js에서 가져와 바로 쿼리문을 날리면 작동되는걸 확인 할 수 있다.
index.js
const initModels = require('./init-models'); // init-models.js에서 메서드를 가져온다.
const { Sequelize } = require('sequelize');
// config/config.json 파일에 있는 설정값들을 불러온다.
// config객체의 env변수(development)키 의 객체값들을 불러온다.
// 즉, 데이터베이스 설정을 불러온다고 말할 수 있다.
const env = process.env.NODE_ENV || 'development';
const config = require("../config/config.json")[env]
// new Sequelize를 통해 MySQL 연결 객체를 생성한다.
const sequelize = new Sequelize(config.database, config.username, config.password, config)
// 모델과 테이블간의 관계가 맺어진다.
const models = initModels(sequelize);
module.exports = models;
app.js
const express = require('express');
const { users, comments } = require('./models/index'); // ./models/index.js에서 설정한 연결된 모델들을 가져온다
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('*', async (req, res, next) => {
try {
const _comments = await comments.findAll({ // 바로 쿼리문 사용
include: {
model: users,
as: "commenter_user", // 위 init-models.js에서 정의한 alias를 반드시 기재
where: { id: 2 },
},
});
console.log(_comments);
res.json(_comments);
} catch (err) {
console.error(err);
next(err);
}
});
// 서버 실행
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});
Executing (default):
SELECT `comments`.`id`, `comments`.`commenter`, `comments`.`comment`, `comments`.`created_at`,
`commenter_user`.`id` AS `commenter_user.id`, `commenter_user`.`name` AS `comme` AS `commenter_user.age`,
`commenter_user`.`married` AS `commenter_user.married`, `commenter_user`.`comment` AS `commenter_user.comment`,
`commenter_user`.`created_at` AS `commenter_user.creatNNER JOIN `users` AS `commenter_user`
ON `comments`.`commenter` = `commenter_user`.`id` AND `commenter_user`.`id` = '1';
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.