[Spring] Soft Delete 사용하기

Dev_ch·2023년 2월 22일
0

이게 왜 삭제됐지?

개발을 하다보면 삭제되면 안되는 데이터가 지워지거나 복잡한 연관관계에서 데이터를 쉽게 지우기 어려운 상황에 놓이게된다. 추가적으로 데이터를 완전히 지우지않고 삭제되었다는 처리만 해놓고 보관을 해둬야 하는 경우도 있기에 우리는 Spring에서 soft delete를 하는 방법을 알아볼 것 이다.

hard delete : 해당 데이터를 DB에서 완전 삭제
soft delete : 해당 데이터가 제거되었다는 값을 설정


해결

우리는 첫번째로 Entity에서 삭제되지 않은 데이터만 불러와야 하는데, 이를 해결하기 위해선 @Where 어노테이션을 사용하면 된다.

@Entity
.
.
.
@Where(clause = "delete_at IS NULL")
public class Board extends BaseEntity {
.
.
.
    private LocalDateTime deleteAt;
}

⚠️@Where 어노테이션의 구문은 SQL로 적어야 한다.

해당 어노테이션은 엔티티를 조회할때 사용할 where 절을 적용해주는데, 우리는 데이터가 삭제되었을때 delete_at에 삭제된 시간을 남겨줄 것 이다. 그렇다면 delete_at이 null인 데이터만 가져오면 되기에 위와 같이 적어주었다.

그러면 데이터를 제거할때 JPA의 delete를 사용하면 '데이터가 아예 삭제되니 save를 통해 해당 데이터를 업데이트 해야하나요?' 라는 의문이 드는데, 우리는 JPA의 save를 통해 업데이트를 해주는것이 아닌 JPA의 delete가 작동되었을때 이를 감지하여 deleteAt의 컬럼만 현재 시간으로 변경해줄 것 이다.

@Entity
.
.
.
@Where(clause = "delete_at IS NULL")
@SQLDelete(sql = "UPDATE board SET delete_at = CURRENT_TIMESTAMP where board_id = ?")
public class Board extends BaseEntity {
.
.
.
    private LocalDateTime deleteAt;
}

⚠️@SQLDelete 어노테이션의 구문은 SQL로 적어야 한다.

@SQLDelete 어노테이션은 delete가 될때 적용할 SQL 구문을 우리가 직접 명시할 수 있다. 즉, soft delete를 하기 위해선 데이터를 삭제하지않고 데이터가 삭제되었다는 표시를 해줘야 하기에 delete_at 컬럼을 삭제된 시간으로 설정해주면 삭제된 게시글이란 것을 알 수 있다.

또한 @Where 어노테이션과 시너지로 정보를 조회할때 delete_at이 null인것만 조회가 들어가기에 삭제된 게시글은 정보를 조회하려해도 조회되지 않는다 !


이러한 식으로 정보를 soft delete하거나 아니면 제거된 데이터만 모아두는 테이블을 만들어 옮겨두는것도 가능하다. 이렇게 삭제를 처리할경우 Spring batch와 같은 스택을 사용하여 기간에 따라 완전 삭제되는 형식을 고민하게 되나 싶다.

아무튼 이번 포스팅은 여기서 끄읏-!

profile
내가 몰입하는 과정을 담은 곳

0개의 댓글