coding/Node.js

Sequelize 시작, migrate 사용 관계 설정

JIN_Coder 2022. 8. 13. 00:53

Sequelize 사용법

 

1. 설치

npm i sequelize mysql2 -S
npm i sequelize-cli -D

sequelize는 Node.js 코드에서 sequelize를 사용

mysql2는 node.js에서 Sequelize를 이용해 MySQL을 더욱 쉽게 조작할 수 도록 도와주는 패키지

sequelize-cli는 우리가 Sequelize를 조금 더 쉽게 사용하도록 도와주는 도구를 설치하는 명령어

 

2. Sequelize 사용 전 설정

npx sequelize init

위와 같이 폴더와 파일들이 생성

 

index.js : 구현할 sequelize 모델을 편리하게 사용할 수 있게 해주는 파일

config.json : 데이터베이스에 연결하기 위한 설정 데이터가 JSON 형식으로 들어가 있음(DB 연결)

디비 사용시 config.json 내용 수정 필요함

 

 

3. 데이터 베이스 생성

npx sequelize db:create

config.json 파일 안에 작성한 DB서버에 연결하고, 데이터 베이스를 생성합니다.

 

 

 

Sequelize 사용해서 테이블 만들기

1. 모델 생성하기

npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string

모델 이름이 User이고, 속성들을 정의해주어서 user.js 파일을 만든다.(마이그레이션 파일도 같이 생성)

user.js 파일

데이터베이스에 읽고 쓰고, 변경하는 데이터를 모델이라는 형태로 구현해서 정해둔 형식대로 다루게 해주는 역할

migrations 파일

데이터베이스에 테이블을 생성하고 제거할 때 여기에 있는 파일을 사용

 

2. 테이블 생성하기

npx sequelize db:migrate

마이그레이션 파일을 기반으로 테이블을 생성한다.()

 

3. 테이블 수정(삭제)

// 마이그레이션 취소(롤백)
npx sequelize db:migrate:undo

// 전체 마이그레이션 취소(전체 롤백)
npx sequelize db:migrate:undo:all

수정이나 덮어쓰기는 안되므로 테이블의 칼럼을 수정할려면,

마이그레이션을 취소하고 내용을 수정 한뒤 다시 테이블을 생성해야 한다.

 

 

Sequelize 사용해서 관계 설정하기

1. 각 테이블의 속성을 작성해 마이그레이션을 한다(외래키, 조인테이블 제외)

Sequelize 사용해서 테이블 만들기방법으로 기본이 되는 테이블을 만들어 준비한다(위 테이블 생성 방법 참고)

 

2 모델 파일에서 관계 설정

기존에 만들어둔 모델의 user.js 파일안에서 static associate(models) { ... } 안에서 belongsto, hasmany, hasone, belongstomany 등의 관계 설정을 해준다.

 

유저는 여러 게시물을 쓴다. => user hasmany post => user.js에서 작성

게시물은 유저 한명에게 쓰여진다 => post belogsto user => post.js에서 작성

게시물은 여러 댓글을 가지고 있다. => post hasmany comment => post.js에서 작성

댓글은 하나의 게시물에 쓰여져 있다 => comment belongsto post => comment.js에서 작성

 

예시)

// models/post.js
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
  class Posts extends Model {
    static associate(models) {
      this.belongsTo(models.Users,{foreignKey: "userId", targetKey: "userId",});
      this.hasMany(models.Comments,{foreignKey: "postId",sourceKey: "postId",});
      this.hasMany(models.Likes,{foreignKey: "postId",sourceKey: "postId",});
    }
  }
  Posts.init(
    {
      postId: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true,
      },
      title: DataTypes.STRING,
      images: DataTypes.STRING,
      content: DataTypes.STRING,
      category: DataTypes.STRING,
      likes: { type: DataTypes.INTEGER, defaultValue: 0 },
    },
    {
      sequelize,
      modelName: "Posts",
    }
  );
  return Posts;
};

 

 

3. 다른 마이그레이션 파일(관계설정해주는 파일)을 만들어 테이블끼리 관계를 맺어준다.

 

3.1 관계설정을 위한 마이그레이션 파일을 만들어 관계를 설정한다.

up 함수는 migration을 실행할 때 실행되고, down은 취소할 때 실행되는 함수

migrations 폴더 안에서 참고하는 테이블 명을 작성할 때는 복수형으로 작성한다.

 

마이그레이션 파일을 만들어주고

npx sequelize migration:generate --name add-associations

파일 내용 작성

// 관계설정을 위한 마이그레이션 파일
// add-association.js

"use strict";

module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.addColumn("Posts", "userId", { // Posts테이블에 userId라는 칼럼을 추가한다
      type: Sequelize.INTEGER,
      allowNull: true,
      references: {
        model: "Users", // Users 모델에서
        key: "userId", // userId 값을 참고해서 칼럼을 추가하고 관계를 맺는다
      },
      // onUpdate: "CASCADE",
      onDelete: "CASCADE", // 관계 맺은 외래키가 삭제되면 post에서도 삭제된다.
    });

    await queryInterface.addColumn("Comments", "postId", { // Comments테이블에 postId라는 칼럼을 추가한다
      type: Sequelize.INTEGER,
      allowNull: true,
      references: {
        model: "Posts", // Posts 모델에서
        key: "postId", // postId 값을 참고해서 칼럼을 추가하고 관계를 맺는다
      },
      // onUpdate: "CASCADE",
      onDelete: "CASCADE", // 관계 맺은 외래키가 삭제되면 comment에서도 삭제된다.
    });
  },

  async down(queryInterface, Sequelize) {
    // 위에서 생성한 필드를 제거합니다.
    await queryInterface.removeColumn(
      'Posts', // name of Source model
      'userId' // key we want to remove
    );
    await queryInterface.removeColumn(
      'Comments', 
      'postId', 
    );
  },
};

마이그레이션 실행으로 관계 맺기

npx sequelize-cli db:migrate

 

마이그레이션 실행 취소

npx sequelize-cli db:migrate:undo

 

 

마이그레이션 후 테이블에 칼럼 추가

 

1. 마이그레이션 파일 생성

npx sequelize migration:create --name add-column

2. 마이그레이션 파일 코드 작성

'use strict';

module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.addColumn('Selects', 'compeltion', {
      type: Sequelize.BOOLEAN,
      defaultValue: false,
    });
  },

  async down(queryInterface, Sequelize) {
    await queryInterface.removeColumn('Selects', 'compeltion');
  },
};

3. 디비에 칼럼 추가

npx sequelize-cli db:migrate

4. 모델 폴더에서 추가된 칼럼 코드 추가

// models/select.js

'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Select extends Model {
    static associate(models) {
      this.belongsTo(models.User, {
        foreignKey: 'userKey',
        targetKey: 'userKey',
      });
      this.hasMany(models.Comment, {
        foreignKey: 'selectKey',
        sourceKey: 'selectKey',
      });
      this.hasMany(models.Vote, {
        foreignKey: 'selectKey',
        sourceKey: 'selectKey',
      });
    }
  }
  Select.init(
    {
      selectKey: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true,
      },
      title: DataTypes.STRING,
      category: DataTypes.STRING,
      deadLine: DataTypes.DATE,
      options: DataTypes.JSON,
      image: DataTypes.JSON,
      compeltion: DataTypes.BOOLEAN, // 추가된 칼럼 부분(여기만 추가)
    },
    {
      sequelize,
      modelName: 'Select',
    }
  );
  return Select;
};

 

 

 

 

 

 

[시퀄라이즈] DB 관계 설정하기

코드스테이츠 팀 프로젝트에서 백엔드를 담당하였을 때, 다른 백엔드 팀원이 DB관계 설정하는데에 어려움을 겪었었다. 그때 나도 한 번 해봤는데 반나절동안 문제를 풀지 못한 기억이 있다. 그

velog.io

 

'coding > Node.js' 카테고리의 다른 글

swagger 설치 및 설정 기본 사용법  (0) 2022.08.17
CORS 사용방법  (0) 2022.08.14
node.js Controller, Service, Repository  (1) 2022.08.07
계층형 아키텍처 패턴(Layered Architecture Pattern)  (0) 2022.08.05
nodemon  (0) 2022.08.04