WDMA에서는 하나의 드레스에 1~3장의 이미지가 속해 있는데 해당 드레스를 삭제하면 그 드레스에 속한 이미지도 같이 삭제가 되어야 한다.
이를 위해, Sequelize의 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,
},
});