Soft Delete
논리적으로만 삭제하는 방법 <-> Hard Delete( 물리적 삭제, 데이터를 삭제함)
논리적으로 삭제한다 -> 유저에게 삭제된 데이터를 보여주지 않고, 데이터를 보관한다.
예를 들어 악성 댓글을 입력한 유저를 신고하고 싶은데 그 유저가 댓글을 삭제한 경우. 피해자 입장에선 신고할 수 없을 것이다. 이때 삭제된 댓글이 보관되어 있다면, 해당 유저를 구분할 수 있을 것이다.
또한 데이터는 소중한 자원이라고 생각한다. 삭제된 데이터를 분석에 이용한다면 후에 좀 더 정확한 솔루션을 제공할 수 있을 것이다.
따라서 데이터 복원, 데이터 분석 목적으로 Soft Delete를 사용할 수 있다.
적용
comment(댓글) 삭제에 Soft Delete를 적용하기 위해
@SQLRestriction("deleted_at is NULL") 애너테이션을 사용한다.
조회가 이루어 질 때 deleted_at 필드가 null인 데이터만 조회된다.
@Table(name = "comment")
@SQLRestriction("deleted_at is NULL")
public class Comment extends Timestamped {
...
@Column(name = "deleted_at")
private LocalDateTime deletedAt = null;
...
public void softDelete() {
this.deletedAt = LocalDateTime.now();
}
...
}
service에서 comment를 삭제할 때 DB에서 삭제시키는 것이 아니라
comment.softDelete(); 함수를 호출하여 comment의 deletedAt 필드에 삭제된 시간을 넣어준다.
이렇게 되면 DB의 deletedAt column에 값이 할당되어 null이 아니기 때문에 조회 되지 않는다.
public void deleteComment(Long todoId, Long commentId, User user) {
findTodo(todoId);
Comment comment = findComment(commentId);
validate(comment.getUser().getId(), user.getId());
comment.softDelete();
}
'Spring' 카테고리의 다른 글
| Spring Day 25 : 팔로우 기능 구현 (0) | 2024.02.29 |
|---|---|
| Spring Day 24 : SSE (Server-Sent Event) (0) | 2024.02.27 |
| Spring Day 21 : @ExceptionHandler, @ControllerAdvice, Spring 예외처리 (0) | 2024.02.22 |
| Spring Day 20 : Mockito (0) | 2024.02.21 |
| Spring Day 19 : 소셜 로그인 (카카오 로그인 연동) (0) | 2024.02.20 |