[공감병동 프로젝트] 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=productionmysql & sequelize 세팅
- 모듈 설치
npm i mysql2 sequelize
npm i -D sequelize-climysql과 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 데이터 삽입
Author And Source
이 문제에 관하여([공감병동 프로젝트] express,mysql,sequelize 세팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@daeseongkim/공감병동-프로젝트-expressmysqlsequelize-세팅저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)