Soft Delete가 왜 필요한가?
SNS 프로젝트를 진행하면서 한가지 상황을 가정해보았다.
누군가가 법적으로 침해되는 게시물이나 댓글을 작성하여 신고를 하려고한다. 하지만 그 회원이 탈퇴를 하면 그 회원이 가지고있는 데이터들이 모두 삭제되었기 때문에 더 이상 신고할 증거가 남지 않게된다.
이러한 상황 외에도 회원이 탈퇴해도 알수없음으로 표시되면서 사라지지 않는 게시물들의 존재를 볼 수 있었다. 이러한 것은 모두 데이터를 물리적으로 삭제한 것(hard delete)이 아닌 논리적으로 삭제한것(soft delete)이다.
Hard Delete와 Soft Delete
- Hard delete: delete쿼리를 날려서 데이터베이스에서 실제로 삭제하는 방법(물리 삭제)
- Soft delete: 실제로 데이터베이스에서 삭제하는 것이 아니라, 테이블에 deleted와같은 필드를 추가해주고, udpate 쿼리를 날려서 deleted값을 변경해주는 방법(논리 삭제)
JPA에서 Soft Delete를 하는 기능 두가지
@SQLDelete
: 엔티티 삭제가 발생했을 때 delete쿼리 대신 실행시켜줄 커스텀 SQL 구문을 뜻하는 애너테이션이다. 엔티티 삭제 요청시 delete 쿼리 대신 적어준 update 쿼리가 실행된다.
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "likes")
@SQLDelete(sql = "UPDATE likes SET deleted_at = now() WHERE id = ?")
public class Like extends BaseEntity {
@SQLDelete 애너테이션을 사용하여 삭제쿼리가 발생할 경우 실제로 삭제가 아닌 deleted_at 컬럼에 현재시간을 적어주었다.
실제로 실행시켜본 결과 delete쿼리를 실행시키면 DB에서 사라지는 것이 아닌 deletedAt 시간이 담기는 것을 확인할 수 있었다.
@Where
: Soft Delete 처리를 하는 경우 조회 요청시 삭제처리가 되지 않은 데이터만을 가져와야한다. 이때 @Where을 이용하면 된다. 데이터베이스의 where 조건절이며, 애너테이션을 붙이게 되면 모든 쿼리에 해당 where 조건문이 붙게 된다.
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@SQLDelete(sql = "UPDATE comment SET deleted_at = now() WHERE id = ?")
@Where(clause = "deleted_at is null")
public class Comment extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Where 애너테이션을 사용하여 해당 엔티티의 모든 쿼리가 발생할 때에 "where deleted_at is null" 이라는 쿼리가 추가로 붙게된다.
그래서 deleted_at이 존재하는 즉, 논리적으로 삭제된 데이터들은 조회할 수 없다.
실제로 댓글을 조회한 결과 아래와 같이 where ( comment0_.deleted_at is null) 쿼리가 포함된것을 볼 수 있다.
Hibernate: select comment0_.id as id1_1_, comment0_.create_at as create_a2_1_, comment0_.deleted_at as deleted_3_1_, comment0_.last_modified_at as last_mod4_1_, comment0_.comment as comment5_1_, comment0_.post_id as post_id6_1_, comment0_.user_id as user_id7_1_ from comment comment0_ where ( comment0_.deleted_at is null) and comment0_.post_id=? order by comment0_.id desc limit ?
아래는 Soft Delete를 적용한 프로젝트 포스팅이다.
https://alcoholble.tistory.com/8
Reference
https://velog.io/@max9106/JPA-soft-delete
'코딩 > JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (2) | 2023.07.17 |
---|---|
[JPA] JPA개념 및 실습 환경 셋팅 (0) | 2023.07.17 |
[JPA] 영속성 전이, 고아객체(Cascade) (1) | 2023.01.07 |