sequelize
는 orm(Object Relation Mapper)이며 object와 table을 매핑해준다.
이것을 사용하기 위해서는 model을 정의해야 하는데 사실 그러기가 꽤 귀찮다.
모델부터 만드는 방법도 있지만, rdbms에서 미리 다 테이블을 정의해놓고 이걸 자동으로 만들어준다면 얼마나 좋을까.
그러기 위해서 sequelize auto
를 쓸 수 있다. 어떻게 해야 할지 엄청 삽질을 많이 했는데 내가 공식문서를 제대로 안 읽어서 그런 것이었던 거 같다.
어쨌든 방법을 정리한다.
ES6를 사용한다. (import, export를 쓴다는 뜻)
"type": "module"
나는 얘네들을 설치헀다.
"mysql2": "^2.3.3",
"sequelize": "^6.20.1",
"sequelize-auto": "^0.8.8",
"sequelize-cli": "^6.4.1"
이중에 sequelize-auto랑 sequelize-cli은 글로벌로 설치해야 하는 것 같은데 이미 그냥 깔아버렸다. 어쩔 수 없지.
sequelize init
이걸 치면 알아서 파일을 만들어주는데 우리가 수정을 해 주어야 한다
이거는... 각자의 환경에 맞게 알아서 해야 하는데
config/config.js
import dotenv from 'dotenv';
dotenv.config();
const config = {
username: process.env.JAWSDB_USERNAME,
password: process.env.JAWSDB_PASSWORD,
database: process.env.JAWSDB_DATABASE,
host: process.env.JAWSDB_HOST,
dialect: 'mysql',
define: {
timestamps: false,
},
};
export default config;
나는 이런식으로 config.js 파일을 만들었다.
그리고 루트의 .env파일에 db정보를 넣었다.
sequelize-auto -o "./models" -d mydatabase -h 127.0.0.1 -u root -p 3306 -x password -e mysql -l esm
보면 알겠지만 -o 경로 -d 데이터베이스 -h 호스트 -u 유저 -p 포트 -x 비밀번호 -l 언어를 입력하면 된다. (클라우드 db도 마찬가지) 마지막에 -l esm
을 붙이는 걸 잊지 말자. 처음에 이 기능이 있는줄 모르고 삽질을 했는데, 저걸 붙이면 알아서 해줌. 신난다!
그럼 테이블 이름.js 파일들이 생기고 models-init.js파일도 생긴다.
이 initModels이라는 함수가 알아서 관계 설정을 해준다.
그럼 이걸 어떻게 쓰는가
models/index.js 파일에서 불러와서 쓰면 된다.
나는 이런식으로 했다.
import Sequelize from 'sequelize';
import config from '../config/config.js';
import initModels from './init-models.js';
const sequelize = new Sequelize(config.database, config.username, config.password, config);
const db = initModels(sequelize);
export { db, sequelize };
매우 짧아졌다.
그리고 이제 app.js 파일에 가보자.
import { sequelize } from './models/index.js';
...
sequelize
.sync({ force: false }) //true면 서버 실행마다 테이블 재생성
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});
서버를 실행하고 콘솔에 데이터베이스 연결 성공이 뜨면 잘 된 것이다
import { db } from '../../models/index.js';
const { book, author, genre, keyword, publisher } = db;
export const getBookList = async (req, res) => {
const page = parseInt(req.query.page) || 1;
const size = parseInt(req.query.size) || 10;
console.log(req.query);
const books = await book.findAll({
offset: (page - 1) * size,
limit: size,
where: {
category: category,
},
include: [
{
model: author,
as: 'authors',
attributes: ['name'],
},
{
model: publisher,
as: 'publishers',
attributes: ['name'],
},
{
model: keyword,
as: 'keywords',
attributes: ['keyword'],
},
{
model: genre,
as: 'genres',
attributes: ['genre'],
},
],
});
res.send(books);
};
이제 목록을 출력할 수 있다