[Back-end] Sequelize의 'cascade' 사용하기

조성철 (JoSworkS)·2020년 5월 5일
1
post-custom-banner

WDMA에서는 하나의 드레스에 1~3장의 이미지가 속해 있는데 해당 드레스를 삭제하면 그 드레스에 속한 이미지도 같이 삭제가 되어야 한다.

이를 위해, Sequelize의 onDelete: 'cascade' 라는 키워드를 이용하여 부모-자식 테이블 간의 연관 리소스를 삭제하는 방법에 대해 알아보고자 한다.

개요

  • 테이블: 'dresses', 'images'
  • 관계 : 1:N
  • DB diagram

onDelete: 'cascade' 설정

아래와 같이 migration과 model 양쪽에서 설정하는 작업이 필요하다.

[설정 1] ./migrations/create-images.js

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('images', {
      
      // 생략
      
      dressId: {
        type: Sequelize.INTEGER,
        allowNull: true,
        onDelete: 'CASCADE',
        references: {
          model: 'dresses',
          key: 'id',
        },
      },
      
      // 생략
      
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('images');
  },
};

[설정 2] ./models/images.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const images = sequelize.define(
    'images',
    {
      filePath: {
        type: DataTypes.STRING,
        allowNull: false,
      },
      fileName: {
        type: DataTypes.STRING,
        allowNull: false,
      },
      mainImage: {
        type: DataTypes.BOOLEAN,
        allowNull: false,
      },
      dressId: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
    },
    {}
  );
  images.associate = function (models) {
    images.belongsTo(models.dresses, {
      foreignKey: { name: 'dressId', allowNull: true },
      onDelete: 'CASCADE',
    });
  };
  return images;
};

작동 순서

1) 'dresses' 테이블
'id: 2'의 드레스 리소스가 1개 존재한다.

2) 'images' 테이블
'id: 4~6'의 이미지 리소스가 3개 존재하며, dressId '2'로 자식 리소스들이다.

3) ./controllers/dress.js
id가 '2'인 드레스를 Sequelize를 이용하여 삭제한다.

const deletedDressResult = await dresses.destroy({
  where: {
    id: 2,
  },
});

참고 자료

post-custom-banner

0개의 댓글