관리 메뉴

프로그래밍 삽질 중

sequelize는 왜 사용되는가? 본문

과거 프로그래밍 자료들/DB(MYSQL)

sequelize는 왜 사용되는가?

평부 2022. 8. 25. 22:18

 

- sequelize : sql 작업을 쉽게 할 수 있도록 도와주는 라이브러리

-  ORM : object relational mapping의 앞글자로 객체와 데이터를 매핑(1대1 짝지음)

- 자바스크립트 문법으로 데이터베이스 조작 가능

 

 

- sequelize를 왜 사용하는가?

* 선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다.

* 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.

* SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.

 

 

출처 : https://velog.io/@source39/Sequelize%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%B5%EB%B6%80-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80

 

Sequelize에 대한 공부- 왜 사용하는가?

시퀄라이즈 공식문서를 읽고 실제로 따라해보면서 가장 중요한 것을 놓쳤다.왜? 시퀄라이즈를 사용해야하는가? 에 대한 생각을 다른 선배들이 작성한 블로그를 보면서 나의 생각을 정리했다.시

velog.io

 

 

- 실제 sequelize 사용해보기

* mssql workbench에서 테이블을 만드는 것이 아닌 node.js를 통해 만듦

* models에 원하는 테이블을 생성 후 sequalize가 돌아가면 만드는 것

* 1:1, 다대다 연결에서 유용하게 사용(댓글달기 같은 경우)

 

 

* 코드 원본 : https://github.com/ZeroCho/nodejs-book/tree/master/ch7/7.6/learn-sequelize/models

 

GitHub - ZeroCho/nodejs-book

Contribute to ZeroCho/nodejs-book development by creating an account on GitHub.

github.com

* 제대로 실행될려면 rotuer, public, views 넣어야 함(코드 원본에서 확인 가능)

 

* app.js (sequelize 사용)

더보기
const express = require("express");
const path = require("path");
const morgan = require("morgan");
const nunjucks = require("nunjucks");

const { sequelize } = require("./models");
const indexRouter = require("./routes");
const usersRouter = require("./routes/users");
const commentsRouter = require("./routes/comments");

const app = express();
app.set("port", process.env.PORT || 3001);
app.set("view engine", "html");
nunjucks.configure("views", {
  express: app,
  watch: true,
});
//DB 연결
sequelize
  .sync({ force: false })
  .then(() => {
    console.log("데이터베이스 연결 성공");
  })
  .catch((err) => {
    console.error(err);
  });

app.use(morgan("dev"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/comments", commentsRouter);

app.use((req, res, next) => {
  const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== "production" ? err : {};
  res.status(err.status || 500);
  res.render("error");
});

app.listen(app.get("port"), () => {
  console.log(app.get("port"), "번 포트에서 대기 중");
});

 

 

* model/comments.js

더보기
const Sequelize = require("sequelize");

module.exports = class Comment extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        comment: {
          type: Sequelize.STRING(100),
          allowNull: false,
        },
        created_at: {
          type: Sequelize.DATE,
          allowNull: true,
          defaultValue: Sequelize.NOW,
        },
      },
      {
        sequelize,
        timestamps: false,
        modelName: "Comment",
        tableName: "comments",
        paranoid: false,
        charset: "utf8mb4",
        collate: "utf8mb4_general_ci",
      }
    );
  }

  static associate(db) {
  //댓글.belongsTo(사용자)
    db.Comment.belongsTo(db.User, { foreignKey: "commenter", targetKey: "id" });
  }
};

 

 

* model/index.js

더보기
"use strict";
const Sequelize = require("sequelize");
const User = require("./user");
const Comment = require("./comment");

const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;

db.User = User;
db.Comment = Comment;

//연결 객체 init
User.init(sequelize);
Comment.init(sequelize);

User.associate(db);
Comment.associate(db);

module.exports = db;

 

 

* model/user.js

더보기
const Sequelize = require("sequelize");

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        name: {
          type: Sequelize.STRING(20),
          allowNull: false,
          unique: true,
        },
        age: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
        },
        married: {
          type: Sequelize.BOOLEAN,
          allowNull: false,
        },
        comment: {
          type: Sequelize.TEXT,
          allowNull: true,
        },
        created_at: {
          type: Sequelize.DATE,
          allowNull: false,
          defaultValue: Sequelize.NOW,
        },
      },
      {
        sequelize,
        timestamps: false,
        underscored: false,
        modelName: "User",
        tableName: "users",
        paranoid: false,
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }

  static associate(db) {
  //1:N관계(사용자 한 명이 댓글(commenter) 여러 개 작성)
    db.User.hasMany(db.Comment, { foreignKey: "commenter", sourceKey: "id" });
  }
};