[공감병동 프로젝트] express,mysql,sequelize 세팅

스키마 다시 변경(4차)

팀원과 함께 스키마를 바탕으로 토론한 결과, 신고 기능 구현을 위한 is_reported, is_blocked 등의 컬럼이 추가되었고, 실존 데이터 상 구현하기 힘든 관계를 제거하고 잠정 확정을 지었다.

백엔드 스택

이번 프로젝트의 목적 자체가 프론트엔드 쪽 연습에 무게를 두었기 때문에,
Javascript, express, mysql, sequelizeORM을 선택해서 비교적 익숙한 방법으로 빠르게 구현하고자 했다.

express

  • app.js
require("dotenv").config();
const cors = require("cors");

const express = require("express");
const router = require("./routes");

const app = express();
const port = process.env.NODE_ENV === "production" ? 80 : 8000;

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

const corsOption = {
  origin: "http://localhost:3000",
  credentials: true,
  method: ["GET", "POST", "OPTIONS", "PUT", "DELETE", "PATCH"],
};
app.use(cors(corsOption));

app.use("/", router);

app.listen(port, () => {
  if (process.env.NODE_ENV === "production") {
    console.log("Production Mode");
  } else if (process.env.NODE_ENV === "development") {
    console.log("Development Mode");
  }
  console.log(`GGBD server app listening at http://localhost:${port}`);
});

CORS 옵션을 설정해주고, 라우터 정리를 해주었다.

  • ./routes/index.js
const express = require("express");
const main = require("./main");
const user = require("./user");

const router = express.Router();

router.use("/", main);
router.use("/user", user);
//다른 라우터들

module.exports = router;

이번 세팅때는 development 환경과 production 환경을 잘 구분해서 해보고 싶었다.
까먹지 않도록 NODE_ENV 변수 설정법을 적어두도록 하겠다.

  • in terminal
export NODE_ENV=development 
export NODE_ENV=production

mysql & sequelize 세팅

  • 모듈 설치
npm i mysql2 sequelize
npm i -D sequelize-cli

mysql과 mysql2의 차이는 promise 지원여부의 차이였다..!
mysql은 callback기반이기 때문에 promise를 사용하지 못하고 npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야 하지만 mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능하다고 한다.

  • sequelize config
require("dotenv").config();

const env = process.env;

const development = {
  username: env.DEV_DB_USERNAME,
  password: env.DEV_DB_PASSWORD,
  database: env.DEV_DB_DBNAME,
  host: env.DEV_DB_HOST,
  dialect: "mysql",
};

const production = {
  username: env.PROD_DB_USERNAME,
  password: env.PROD_DB_PASSWORD,
  database: env.PROD_DB_DBNAME,
  host: env.PROD_DB_HOST,
  dialect: "mysql",
  port: env.PROD_DB_PORT,
};

module.exports = { development, production };

development와 production 환경에 따라 정의를 해주었다. models에 적힌 코드를 따라 필요한 환경에서 DB에 연결하게 될것이다.

  • migration 생성

    각 테이블을 만들어주고, 마지막으로 관계를 설정해주었다.

  • define_associations

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addConstraint("posts", {
      name: "users-posts",
      fields: ["users_id"],
      type: "foreign key",
      references: {
        table: "users",
        field: "id",
      },
      onDelete: "cascade",
      onUpdate: "cascade",
    });
    //생략
  }
  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeConstraint("posts", "users-posts");
    //생략
  }
}
  • ./models/user.js
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
  class users extends Model {
    static associate(models) {
      users.hasMany(models.posts, {
        foreignKey: "users_id",
      });
//생략
  }
  users.init(
    {
      nickname: DataTypes.STRING,
      img: DataTypes.STRING,
      description: DataTypes.STRING,
    },
    {
      sequelize,
      modelName: "users",
    }
  );
  return users;
};

마지막으로 models에 각 파일에 각각의 관계를 지정해주고(hasMany, belongsTo 등등)
DB를 생성한 뒤에 마이그레이션을 실행했다.

npx sequelize-cli db:create
npx sequelize-cli db:migrate

결과(in dataGrip)


잘 들어갔다!

DB 남은 일
1. mysql 시간 설정 한국에 맞추기
2. Seed 파일 만들고 dummy 데이터 삽입

좋은 웹페이지 즐겨찾기