sequelize auto 사용하기 (esm)

milmil·2022년 6월 14일
0

노드와 나

목록 보기
2/8
post-custom-banner

sequelize는 orm(Object Relation Mapper)이며 object와 table을 매핑해준다.
이것을 사용하기 위해서는 model을 정의해야 하는데 사실 그러기가 꽤 귀찮다.
모델부터 만드는 방법도 있지만, rdbms에서 미리 다 테이블을 정의해놓고 이걸 자동으로 만들어준다면 얼마나 좋을까.

그러기 위해서 sequelize auto를 쓸 수 있다. 어떻게 해야 할지 엄청 삽질을 많이 했는데 내가 공식문서를 제대로 안 읽어서 그런 것이었던 거 같다.

어쨌든 방법을 정리한다.

ES6를 사용한다. (import, export를 쓴다는 뜻)

package.json

  "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

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);
};

이제 목록을 출력할 수 있다

profile
쓰고 싶은 글만 씀
post-custom-banner

0개의 댓글