Prisma soft delete 적용

isthis·2022년 10월 2일
2

Prisma를 사용하여 백엔드 서버를 마이그레이션 중이다.
기존에 사용하던 ORM인 sequielize에는 delete 관련 Column이 있을 경우, sequelize 설정으로 간단하게 soft delete를 적용시킬 수 있었다. Prisma에는 그런 기능이 없으니 한 번 구현해보자.

Prisma를 사용하고 있는 이유

  1. Node.js 와 TypeScript 를 위한 Auto-generated & Type-safe 한 Querybuilder 제공
    1-1. prisma client 생성 시, model에 대한 schema와 type들을 완벽하게 인식하여 type 안정성이 높음
    1-2. 기존 DB를 사용하기 위한 간편한 Introspect 기능 제공
    1-3. prisma generate로 model 선언 불필요
  2. 여러 개의 prisma client를 활용하여 다수의 DB 작업 가능
  3. GUI Database Tool(Prisma Studio) 제공

(자세한 이유와 Prisma에 관한 내용은 다음에..)

Prisma Soft Delete 적용기

soft delete의 세부 동작은 삭제 동작 시, delete 관련 coulmn을 update하는 방식이다. 이런 방식의 문제(불편함)는 다음과 같다.

  1. 삭제 행위임에도 prisma opretaion은 update라는 mismatch 현상
  2. data model의 delete column의 유무에 따라 operation이 달라짐

사실 큰 문제는 없지만 조금 불편해서 soft delete를 구현해봤다. delete column이 존재할 경우, 자동으로 delete column을 update하도록 middleware를 적용시켜보자.

prisma 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. prisma operation으로 hard delete(DB row 제거)가 불가능하다.
  2. depth가 깊어지는 경우, soft delete 적용이 안되는 문제가 있던 것으로 기억한다. 요거는 더 자세하게 알아볼 예정.
    https://zenstack.dev/blog/soft-delete#soft-delete-in-prisma

1번 문제는 raw query를 작성하는 등의 방법으로 해결이 가능할 것 같다.

결론

문제점들을 생각하여 미들웨어를 통해 자동으로 변환할지 잘 판단하여 적용해야 할 것 같다.

잘못된 정보나 추가 정보, 조언이 있을 경우 댓글로 말씀 부탁드려요!

참고자료
프리즈마 공식문서
프리즈마 공식문서 - soft-delete-middleware
Blausee blog

profile
공부

0개의 댓글