Soft Delete란?

soft delete는 실제로 데이터베이스에서 데이터를 삭제하는 것이 아니라,

테이블에 deleted와 같은 필드를 추가해주고,

update 쿼리를 날려서 deleted 값을 변경해주는 방법이다.

JPA의 구현체인 하이버네이트에는 아래 2가지 기능이 있는데,

  1. 삭제시 delete 쿼리 대신 다른 구문 실행
  2. 어떤 엔티티를 조회하는 모든 쿼리에 where 조건을 추가해주는 기능

이를 이용하면 soft delete처리와 삭제되지 않은 데이터 조회를 편리하게 할 수 있다.

1. 삭제시 delete 쿼리 대신 다른 구문 실행시키기

@SQLDelete

기존 hard delete는 deletemapping을 통해 ID를 삭제한다.

soft delete의 경우 삭제가 아닌 update를 통해 deleted 컬럼에 값을 넣어주어야 하기때문에

delete 를 수행하기 어렵다.

하여 soft delete를 위해서는

삭제 로직이 수행되면 delete 쿼리 대신, update 쿼리를 통해 deleted 필드 값만 변경 시켜줘야 한다.

이때 SQLDelete를 사용할 수 있다.

@SQLDelete는 엔티티 삭제가 발생했을 때 delete 쿼리 대신 실행시켜줄 커스텀 sql 구문을 뜻하는 어노테이션으로 이렇게 @SQLDelete를 적어주면 엔티티 삭제 요청시 delete 쿼리 대신 적어준 update 쿼리가 실행된다.

@SQLDelete(sql = "UPDATE member m SET m.deleted_at = current_timestamp WHERE m.id = ?")
@Entity
public class Member {
        ...

이런식으로 사용하게 되며 선택한 update를 원하는 테이블의 delete 컬럼에 원하는 값을 넣어주면 된다.

Open image-20240201-075523.png