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