수진개발서
article thumbnail
Published 2023. 1. 6. 00:46
[JPA] Soft Delete 적용하기 코딩/JPA

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 시간이 담기는 것을 확인할 수 있었다.

순서대로 id, created_at, last_modified_at, deleted_at, post_id, user_id컬럼이다.

@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

 

[SNS Project] Soft Delete 리펙토링(@Modifying)

욕구사항 좋아요 기능에 Soft Delete를 적용하여 삭제될 시 deleted_at에 삭제된 시간을 기록한다. 코드 좋아요 기능 Like @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor @Table(name = "likes") @SQLDelete(sql =

alcoholble.tistory.com

Reference

https://velog.io/@max9106/JPA-soft-delete

 

[JPA] soft delete 자동으로 처리하기

데이터를 삭제하는 방법에는 hard delete, soft delete 2가지 종류가 있습니다. hard delete는 delete 쿼리를 날려서 데이터베이스에서 실제로 삭제하는 방법을 말합니다.soft delete는 실제로 데이터베이스에

velog.io

 

'코딩 > JPA' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (2) 2023.07.17
[JPA] JPA개념 및 실습 환경 셋팅  (0) 2023.07.17
[JPA] 영속성 전이, 고아객체(Cascade)  (1) 2023.01.07
profile

수진개발서

@sujin_park0607

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!