Sequelize ORM 사용하기

1. Sequelize ORM DB 연결 테스트

// database.js
import { config } from "../config.js";
//import mysql from "mysql2";
import SQ from "sequelize";

const { host, user, database, password } = config.db;
export const sequelize = new SQ.Sequelize(database, user, password, {
  host,
  dialect: "mysql",
});
// app.js
sequelize.sync().then((client) => {
  const server = app.listen(config.host.port);
  initSocket(server);
}); // DB가 잘 연결된 다음, 서버 실행 (sequelize는 자동으로 로그를 기록한다) 나중에 꺼주도록 하겠음!

2. 테이블 생성 / 정의

import { db, sequelize } from "../db/database.js";
import SQ from "sequelize";
const DataTypes = SQ.DataTypes;

const User = sequelize.define("user", {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true,
  },

  username: {
    type: DataTypes.STRING(45),
    allowNull: false,
  },
  password: {
    type: DataTypes.STRING(128),
    allowNull: false,
  },
  name: {
    type: DataTypes.STRING(128),
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING(128),
    allowNull: false,
  },
  url: DataTypes.TEXT,
});

Sequelize 를 연결하면, 자동으로 로그가 기록된다. 테이블이 없다면 자동으로 생성시킨다는 로그를 볼 수 있다 🙂

로그를 남길 필요가 없다면 Sequelize 정의시, logging:false 를 주면 된다.

시퀄라이즈가 테이블 스키마 생성 / 정의 해줬음을 볼 수 있다. (createdAt 과 updatedAt 은 자동 생성됨)

만약 timestamp 가 필요없다면, define() 시 인자로 timestamps: false 를 넘기면 된다.


3. user 찾기 / 생성 수정

기존 ‘https://mingsayz.com/?p=3117’ 에서 mysql 만을 이용해서 작성했던 코드와 비교해보자 !

export async function findByUsername(username) {
  return User.findOne({ where: { username } });
}

export async function findById(id) {
  return User.findByPk(id);
}

export async function createUser(user) {
  return User.create(user).then((data) => data.dataValues.id);
}

4. 전체 코드 수정

import { sequelize } from "../db/database.js";
import SQ from "sequelize";
import { User } from "./auth.js";
const DataTypes = SQ.DataTypes;
const Sequelize = SQ.Sequelize;

const Tweet = sequelize.define("tweet", {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    allowNull: false,
    primaryKey: true,
  },
  text: {
    type: DataTypes.TEXT,
    allowNull: false,
  },
});
Tweet.belongsTo(User);

const INCLUDE_USER = {
  attributes: [
    "id",
    "text",
    "createdAt",
    "userId",
    [Sequelize.col("user.name"), "name"],
    [Sequelize.col("user.username"), "username"],
    [Sequelize.col("user.url"), "url"],
  ],
  include: {
    model: User,
    attributes: [],
  },
};

const ORDER_DESC = {
  order: [["createdAt", "DESC"]],
};

export async function getAll() {
  return Tweet.findAll({ ...INCLUDE_USER, ...ORDER_DESC });
}

export async function getAllByUsername(username) {
  return Tweet.findAll({
    ...INCLUDE_USER,
    ...ORDER_DESC,
    include: {
      ...INCLUDE_USER.include,
      where: { username },
    },
  });
}

export async function getById(id) {
  return Tweet.findOne({
    where: { id },
    ...INCLUDE_USER,
  });
}

export async function create(text, userId) {
  return Tweet.create({ text, userId }).then((data) =>
    this.getById(data.dataValues.id)
  );
}

export async function update(id, text) {
  return Tweet.findByPk(id, INCLUDE_USER).then((tweet) => {
    tweet.text = text;
    return tweet.save();
  });
}

export async function remove(id) {
  return Tweet.findByPk(id).then((tweet) => {
    tweet.destroy();
  });
}