Spring

Spring Day 23 : Soft Delete

우 석 2024. 2. 26. 23:53

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();
    }