물리 삭제와 논리 삭제

송철진·2023년 6월 25일
0

다시보기

목록 보기
2/2
post-custom-banner

참조:

게시글 삭제

게시글 삭제 기능 구현 중 그냥 postId가 일치하는 게시글을 삭제할 경우 해당 데이터를 참조하는 다른 테이블이 영향을 받아 참조 에러가 발생하는 현상이 있었다.
이에 대한 해결 방법으로 물리삭제와 논리삭제라는 걸 알게 되었다.

물리 삭제

데이터를 물리적으로 삭제하는 방법이다.
참조 문제를 해결하려면 게시글을 참조하는 다른 테이블의 데이터를 먼저 순서대로 삭제해야한다.

  1. 게시글 id로 조회한 게시글 댓글의 id로 댓글 투표 삭제
const post = await Post.findOneOrFail({ where: { identifier, slug } });
const comments = await Comment.find({ where: { postId: post.id } });
      
	comments.forEach(async (v) => {
        const a = await AppDataSource.createQueryBuilder()
          .delete()
          .from(Vote)
          .where("commentId = :commentId", { commentId: v.id })
          .execute();
    });
  1. 게시글 id로 댓글 삭제
	await AppDataSource.createQueryBuilder()
        .delete()
        .from(Comment)
        .where("postId = :postId", { postId: post.id })
        .execute();
  1. 게시글 id로 게시글 투표 삭제
	await AppDataSource.createQueryBuilder()
        .delete()
        .from(Vote)
        .where("postId = :postId", { postId: post.id })
        .execute();
  1. 게시글 id로 게시글 삭제
    await AppDataSource.createQueryBuilder()
        .delete()
        .from(Post)
        .where("id = :id", { id: post.id })
        .execute();

그런데 이렇게 할 경우 댓글 작성자가 자신이 작성했던 댓글을 다시 조회할 수 없는 문제가 있다.
원글이 삭제되어도 댓글 작성자가 자신의 댓글을 조회할 수 있게 하려면?

논리 삭제(soft delete)

논리삭제는 데이터가 물리적 DB에 남아있지만 delete date 값을 입력받아
마치 삭제된 것처럼 보여주는 하는 방식이다.

	await AppDataSource.createQueryBuilder()
        .softDelete()
        .from(Post)
        .where("id = :id", { id: post.id })
        .execute();

참고로 delete date 열을 추가해야한다.

  // src/entities/Post.ts
  @DeleteDateColumn({ precision: null })
  deletedAt: Date | null;
profile
검색하고 기록하며 학습하는 백엔드 개발자
post-custom-banner

0개의 댓글