Prisma를 사용하여 백엔드 서버를 마이그레이션 중이다.
기존에 사용하던 ORM인 sequielize에는 delete 관련 Column이 있을 경우, sequelize 설정으로 간단하게 soft delete를 적용시킬 수 있었다. Prisma에는 그런 기능이 없으니 한 번 구현해보자.
(자세한 이유와 Prisma에 관한 내용은 다음에..)
soft delete의 세부 동작은 삭제 동작 시, delete 관련 coulmn을 update하는 방식이다. 이런 방식의 문제(불편함)는 다음과 같다.
사실 큰 문제는 없지만 조금 불편해서 soft delete를 구현해봤다. delete column이 존재할 경우, 자동으로 delete column을 update하도록 middleware를 적용시켜보자.
다음과 같이 코드를 구현하였다.
this.$use(async (params, next) => {
if (prismaClient.Prisma[`${params.model}ScalarFieldEnum`]['deletedAt']) {
const koNow = dayjs.utc().add(9, 'hour').toDate();
if (params.action === 'delete') {
params.action = 'update';
params.args['data'] = {
deletedAt: koNow,
};
} else if (params.action === 'deleteMany') {
params.action = 'updateMany';
if (params.args.data !== undefined) {
params.args.data['deletedAt'] = koNow;
} else {
params.args['data'] = {
deletedAt: koNow,
};
}
}
}
return next(params);
});
2L에서 prisma 동작 대상 model에 deletedAt이라는 column이 포함되어 있는 경우를 확인하고, delete와 deleteMany operation을 update, updateMany로 변경시켜준다.
1번 문제는 raw query를 작성하는 등의 방법으로 해결이 가능할 것 같다.
문제점들을 생각하여 미들웨어를 통해 자동으로 변환할지 잘 판단하여 적용해야 할 것 같다.
잘못된 정보나 추가 정보, 조언이 있을 경우 댓글로 말씀 부탁드려요!
참고자료
프리즈마 공식문서
프리즈마 공식문서 - soft-delete-middleware
Blausee blog