2023-08-30 21:02:49

Sequelize란?

Sequelize는 Node.js 환경에서 사용되는 ORM(Object-Relational Mapping) 라이브러리 입니다.

객체와 데이터베이스를 ORM 라이브러리가 매핑 시켜 JavaScript구문으로 SQL문을 직접 작성하지 않고 데이터베이스 작업을 수행 할 수 있게 해줍니다. 

 

Sequelize의 주요 기능

  • 데이터베이스 지원 : PostgreSQL, MySQL, SQLite, MSSQL 및 MariaDB와 같은 주요 관계형 데이터베이스 시스템을 지원합니다. 여러 데이터베이스 시스템을 지원하기 때문에 코드 변경없이 다른 데이터베이스로 마이그레이션이 가능합니다.
  • 보안 : SQL 인젝션 공격으로 부터 애플리케이션을 보호해 주며 직접 쿼리를 작성할 때 발생할 수 있는 보안 문제를 최소화하는데 도움을 줍니다.
  • 개발 속도 향상 : 객체 지향 접근 방식과 다양한 유틸리티 덕분에 개발 속도가 빨라집니다.
  • 유지 보수 : 코드가 구조화 되기 때문에 유지보수에 용이합니다.
  • 검증 : Sequelize는 모델 정의 시 속성에 대한 검증을 제공하기 때문에 데이터의 무결성을 보장합니다.
  • Associations : 관계형 데이터베이스에서 테이블 간의 관계를 쉽게 정의하고 관리 할 수 있습니다.

 

기본 설정 방법

  • Sequelize 기본 설정 방법 및 데이터베이스 테이블 생성 모델에 관한 짧은 설명입니다.

app.js

const express = require("express");
const path = require("path");
const dot = require("dotenv").config();
const { Sequelize, User } = require("./models");

const app = express();

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

// 시퀄라이즈 구성 연결 매핑
// sync 함수는 데이터 베이스를 동기화 시켜주는 메소드
// focus true : 값이 있으면 때 초기화 false 초기화 안됨
// Sequelize는 promise 기반
Sequelize.sync({ focus: true })
  .then(() => {
    // 연결 성공
    console.log("connect sccess");
  })
  .catch((err) => {
    // 연결 실패
    console.error(err);
  });

app.listen(process.env.PORT, () => {
  console.log("Server On use PORT : 8080");
});

 

model/config.js

// dialect 사용할 데이터 베이스
const config = {
  dev: {
    // env 파일에 정의 되어 있는 USERNAME, PASSWORD, DATABASE, HOST를 가져옴
    username: process.env.USERNAME,
    password: process.env.PASSWORD,
    database: process.env.DATABASE,
    host: process.env.HOST,
    dialect: "mysql",
  },
};

module.exports = config;

model/index.js

const Sequelize = require("sequelize");
const config = require("./config");
const User = require("./users");

const sequelize = new Sequelize(
  config.dev
);

// 내보내줄 빈 객체
const db = {};
db.Sequelize = sequelize;
db.User = require("./users");

// init에서 최초로 User를 실행해서 Sequelize.Model의 클래스를 User가 상속받음
User.init(sequelize);

module.exports = db;

model/users.js

const Sequelize = require("sequelize");

// User 클래스에 sequelize안의 model 클래스를 상속
class User extends Sequelize.Model {
  static init(sequelize) {
    // super.init() 상속 받은 부모의 함수를 실행
    // init 메소드
    // 첫번째 매개변수 : 컬럼에 대한 설정 값
    // 두번째 매개변수 : 테이블의 자체 설정 값
    return super.init(
      {
        // 컬럼 설정

        // sequelize는 모델을 정의 할때 별도로 id 필드를 만들지 않으면 자동으로 primary key를 갖는 id 컬럼을 생성
        // VARCHAR == STRING
        // allowNull : null 허용 여부
        // primaryKey : 기본키 설정 여부
        // unique : 고유키(중복되지 않음) 사용 여부
        // type: Sequelize.STRING, 선언할때 보통 require해서 sequelize를 가져올때 구조분해 해서 Datatypes을 가져와서 쓰던데 여긴 이렇게 써도 동작하는 원리가 뭐지?
        // -> type: Sequelize.STRING과 Datetypes를 구조 분해해서 type: Datetypes.STRING을 사용하는 방법 둘다 맞는 방법
        // STRING으로 선언하면 VARCAHR(255)로 만들어짐
        // VARCHAR의 경우 1 ~ 65535 선택할 수 있지만 TEXT 타입의 경우 무조건 65535 고정
        name: {
          type: Sequelize.STRING,
          allowNull: false,
          unique: true,
        },
        age: {
          type: Sequelize.INTEGER,
          allowNull: false,
        },
        msg: {
          type: Sequelize.TEXT,
        },
      },
      {
        // 테이블 설정
        // 매개변수로 전달 받은 sequelize 작성

        // timestamps : 테이블에 row을 추가 했을때 생성 시간과 업데이트 시간을 표기
        // created_at과 updated_at 이라는 컬럼이 자동으로 추가
        // row추가 했을때 시간을 기록해주고 수정했을때도 시간을 기록 해줌

        // underscored : 기본 표기법은 스네이크 표기법으로 되어 있지만 표기법을 카멜 표기법으로 바꿈 created_at -> createdAt
        // modelName : 모듈의 이름을 설정 (데이터 주고 받을때 사용)
        // tableName : 테이블 이름
        // paranoid : true로 설정하면 deleted_at이라는 컬럼 생성 row를 삭제 해도 데이터는 남아있고 맨 뒤에 삭제한 시간이 남게됨
        // charset : 인코딩 방식 설정
        // collate : 인코딩 방식 설정
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "User",
        tableName: "orm_users",
        paranoid: true,
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }

module.exports = User;
728x90