참조:
게시글 삭제 기능 구현 중 그냥 postId가 일치하는 게시글을 삭제할 경우 해당 데이터를 참조하는 다른 테이블이 영향을 받아 참조 에러가 발생하는 현상이 있었다.
이에 대한 해결 방법으로 물리삭제와 논리삭제라는 걸 알게 되었다.
데이터를 물리적으로 삭제하는 방법이다.
참조 문제를 해결하려면 게시글을 참조하는 다른 테이블의 데이터를 먼저 순서대로 삭제해야한다.
댓글 투표
삭제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();
});
댓글
삭제 await AppDataSource.createQueryBuilder()
.delete()
.from(Comment)
.where("postId = :postId", { postId: post.id })
.execute();
게시글 투표
삭제 await AppDataSource.createQueryBuilder()
.delete()
.from(Vote)
.where("postId = :postId", { postId: post.id })
.execute();
게시글
삭제 await AppDataSource.createQueryBuilder()
.delete()
.from(Post)
.where("id = :id", { id: post.id })
.execute();
그런데 이렇게 할 경우 댓글 작성자가 자신이 작성했던 댓글을 다시 조회할 수 없는 문제가 있다.
원글이 삭제되어도 댓글 작성자가 자신의 댓글을 조회할 수 있게 하려면?
논리삭제는 데이터가 물리적 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;