개발일지

개발일지 38일차

index.ys 2023. 4. 25. 01:09

Sequelize

- ORM(Object Relational Mapping)으로써 자바스크립트 객체 DB의 관계연결해주는 도구이다.

ORM

  • ORM이란 object relational mapping
  • ORM이란 객체와 데이터베이스의 관계를 매핑(연결)해주는 도구이다
  • ORM이란 프로그래밍언어의 객체와 관계형데이터베이스(RDB)를 자동으로 매핑해주는도구이다

ORM장점

  • DB를 변경할때 ORM을 사용하면 Raw query를 사용했던 경우에도 모든 Raw query를 변경하지 않고 ORM의 속성만 변경하면 자유롭게 DB를 변경할 수 있다.
  • DB또는 Table의 속성이 변경되었을때 빠르게 수정이 가능하다

Raw query로 table 속성 수정시

수정전 테이블 속성

INSERT INTO Posts (title, content)
       VALUE ("제목", "내용");

수정후 테이블 속성

INSERT INTO Posts (title, content, visibility)
       VALUE ("제목", "내용", "visible");
# 게시글의 visivility Column이 추가되었습니다.

ORM으로 테이블의 속성 수정시 sequelize의 Model을 수정하기만 하면 Raw query를 수정하지 않고 컬럼에 대한 정보추가나 속성제어가능

Model 예시

'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class UserInfos extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here

      // 1. UserInfos 모델에서
      this.belongsTo(models.Users, { // 2. Users 모델에게 1:1 관계 설정을 합니다.
        targetKey: 'userId', // 3. Users 모델의 userId 컬럼을
        foreignKey: 'UserId', // 4. UserInfos 모델의 UserId 컬럼과 연결합니다.
      });
    }
  }

  UserInfos.init(
    {
      userInfoId: {
        allowNull: false, // NOT NULL
        autoIncrement: true, // AUTO_INCREMENT
        primaryKey: true, // Primary Key (기본키)
        type: DataTypes.INTEGER,
      },
      UserId: {
        allowNull: false, // NOT NULL
        type: DataTypes.INTEGER,
        unique: true, // UNIQUE
      },
      name: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
      },
      age: {
        allowNull: false, // NOT NULL
        type: DataTypes.INTEGER,
      },
      gender: {
        allowNull: false, // NOT NULL
        type: DataTypes.STRING,
      },
      profileImage: {
        type: DataTypes.STRING,
      },
      createdAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
      updatedAt: {
        allowNull: false, // NOT NULL
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
    },
    {
      sequelize,
      modelName: 'UserInfos',
    }
  );
  return UserInfos;
};

Sequelize의 Migration, Model

Mirgration

- Mirgation(마이그레이션)은 sequelie CLI를 이용해 MySQL에 테이블을 생성하기 위해 사용됨

- 엑셀에서 새로운 시트를 추가하거나 기존 시트의 컬럼을 추가하거나 수정하는 것과 유사합니다. Migration 파일을 통해 데이터베이스 스키마를 변경할 수 있습니다.

Model

- model은 특정 Table과 Column의 속성값을 입력하여 MySQL과 express 프로젝트르 연결(mapping)시켜줌

- 엑셀에서 시트를 통해 데이터를 다루는 것과 유사합니다. 각 모델은 데이터베이스 테이블과 일치하며, 해당 테이블에서 데이터를 생성, 읽기, 수정 및 삭제할 수 있는 메서드를 제공합니다.

 

- 예를 들어, 학생 데이터를 다룬다고 가정해봅시다. Sequelize를 사용하여 학생 데이터베이스 테이블을 다루기 위해 Migration 파일을 작성하여 새로운 컬럼을 추가하거나 기존 컬럼을 수정할 수 있습니다. 이후, 모델을 정의하여 학생 데이터를 생성, 읽기, 수정 및 삭제하는 메서드를 제공하며, 이를 통해 데이터 유효성 검사를 수행할 수 있습니다.

 

예를 들어, 학생 데이터의 경우, 학생 이름, 학번, 전공, 학년 등의 정보가 있을 수 있습니다. Migration을 통해 학생 데이터베이스 테이블에 새로운 컬럼을 추가하거나 기존 컬럼을 수정할 수 있으며, 모델을 통해 학생 데이터를 생성, 읽기, 수정 및 삭제하는 메서드를 제공할 수 있습니다. 이를 통해 학생 데이터를 관리하고 필요한 경우 데이터 유효성 검사를 수행할 수 있습니다.

ERD(Entity Relationship Diagram)

  • ERD의 정의는 개체(Entity)와의 관계(Relationship)를 그림으로 표현 한것을 ERD(개체관계도) 라고 한다.
  • DB를 개발하기 전에 DB설계의 이해를 높이기 위해 데이터 모델링을 실시함
  • 쿼리문을 작성할때 구조화된 테이블들을 보고 체계화된 DB설계가능
  • 데이터의 특징에 맞게 속성설정 가능 

출처: https://sum0725.tistory.com/12

엔티티(Entity)

  • 엔티티(entity)는 정의 가능한 사물 또는 개념을 의미
  • ex) 사람, 프로필, 도서정보 같은 무형의 정보도 데이터화가 가능
  • 데이터베이스의 테이블이 엔티티로 표현됨 위 이미지에서는 student, professor, department등이 엔티티라고 볼 수 있음

엔티티 속성(Entity Attribute)

  • 엔티티에는 개체가 갖고있는 속성을 포함함
  • ex) student 엔티티에는 name, userId, grade, idnum, birthdate 처럼 student라는 엔티티(테이블)이 가지고 있는 개체(컬럼)들이 엔티티 속성(entytu attribute)이다 

엔티티 도메인(Entity Domain)

  • 도메인은 속성의 값, 제약사항 등에 대한 범위를 표현
  • student 테이블에서 INT(정수), VARCHAR(값의 한계),DATE TIME등 개체속성의 값, 타입, 제한등을 표현함.