[JPA] Soft Delete 개발 방법(Hard Delete과의 차이)

2025. 2. 17. 19:15·Spring/JPA
728x90
반응형
SMALL

Soft Delete란?

이름 그대로 부드러운 삭제이다. Hard Delete는 데이터베이스 내의 데이터를 실제로(물리적) 삭제를 해버린다.
Soft Delete는 논리적으로 삭제를 표기하는 방법이다. 현업에서는 데이터를 몇 년간 보존해야 하는 규정이 존재할수도 있기에 몇 년간 데이터를 보관해두다가 Batch 작업을 통해 일괄적으로 데이터를 처리하기도 한다.
또한 잘못 삭제했을 경우 백업이 가능하기에 사용하기도 한다.

Soft Delete의 단점?

  • 데이터베이스에 계속해서 데이터가 쌓이므로 데이터베이스의 용량이 커질 수 밖에 없다. 이후 배치작업을 통해 데이터를 삭제하는 과정이 필요하다.
  • SELECT조회 시 불필요한 검색 조건을 추가해야 한다.
  • Where을 통한 필터링이 꼭 추가되어야 한다.

기존의 Soft Delete 방식

기존에는 Soft Delete 기능을 사용하기 위해서는 개념적으로 사용해야 하는 @Where 절과 같은 기능을 사용하여, 삭제 컬럼에 대한 flag 조건을 엔티티 자체에 붙여서 사용해야 했다.
또한 삭제 조건을 delete문이 아닌 update절로 바꾸기 위해 @SQLDelete문이 필요했다. 또한 @Where의 clause 속성을 통해 필터링할 컬럼을 커리로 지정해줘야 했다.
Soft Delete를 사용하기 위해서는 많은 속성, 컬럼 데이터를 지정해줘야 하는 번거로움이 있었다.

@SoftDelete의 출현

이전과 달리 혀재는 @SoftDelete라는 어노테이션을 하나만 지정해두면 저절로 deleted라는 컬럼이 생기며 기본 값으로 false가 지정된다.
이 어노테이션을 통해서 자식 엔티티도 함께 SoftDelete처리를 할 수 있다. 방법은 간단하다 자식 엔티티에 @SoftDelete를 붙여주면 된다.
별도의 Cascade설정 없이도 함께 삭제가 가능하다.
이 외에도 다양한 장점이 있다. deleted라는 자동으로 생성되는 컬럼이 싫다면 아래처럼 설정할 수 있다.
그 대신 꼭 insertable과 updatable을 false로 지정하여 직접 접근하는 방법을 차단하는 설정을 해줘야 한다.

@SoftDelete(columnName = "is_deleted")

@Column(name = "is_deleted", insertable = false, updatable = false)  
private boolean isDedleted;

SoftDelete를 꼭 boolean으로 써야할까?

Soft Delete를 LocalDateTime으로 처리한다면 더 좋지 않을까하는 고민을 했다. boolean값으로 지정하면 false로 처리되는 이후에는 해당 유저에 대한 작업이 추가로 이뤄졌는지 어렵기 때문에 어느 시점에 삭제처리가 되었는지도 모르기 때문이다.
만약 5년 뒤 휴먼 유저의 데이터를 삭제한다고 하면 다음과같이 SoftDelete컬럼을 사용해서 이미 탈퇴처리한 유저들의 데이터를 지울수도 있기에 유용하게 사용할 수 있을수도 있을것같다.
그게 아니라면 @SoftDelete컬럼을 boolean으로 두고 유저의 삭제 시간을 별도로 deletedAt, deletedBy를 두어서 삭제 주체와 삭제 시간을 기록으로 남기는 방법도 있을 것 같다.


위 사진은 @SoftDelete의 속성들이다. converter를 사용할 수 있으나 Boolean 한정이고 nul을 허용하지 않는다.
strategy 속성을 통해서는 DELETED, ACTIVE 전략을 사용할 수 있다.
DELETED는 행이 삭제되었는지를 추적한다. true라면 삭제됨, flase는 삭제되지 않음
ACTIVE는 행이 활성 상태인지 추적한다. true는 삭제되지 않은 활성상태, false라면 비활성상태를 가리킨다.

기본값으로는 DELETED를 쓰고 있다.

728x90
반응형
SMALL

'Spring > JPA' 카테고리의 다른 글

[JPA, Kafka] @Transactional과 Kafka 메세지 전송 시점  (0) 2025.03.09
[JPA] @Transaction을 붙이지 않았을 때 생기는 문제, JPA Proxy, LazyLoading과 EagerLoading N+1 문제  (0) 2025.02.22
[개념 정리]Spring Boot에서 JPA의 Soft Delete와 Cascade 연관관계  (1) 2024.12.09
save the transient instance before flushing  (1) 2024.11.20
@Where Deprecated되고 새로 쓰이는 @SQLRestriction  (1) 2024.11.20
'Spring/JPA' 카테고리의 다른 글
  • [JPA, Kafka] @Transactional과 Kafka 메세지 전송 시점
  • [JPA] @Transaction을 붙이지 않았을 때 생기는 문제, JPA Proxy, LazyLoading과 EagerLoading N+1 문제
  • [개념 정리]Spring Boot에서 JPA의 Soft Delete와 Cascade 연관관계
  • save the transient instance before flushing
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      리눅스
      자바 알고리즘
      리눅스마스터2급
      자바 면접
      redis
      JavaScript
      spring redis
      자바스크립트
      Til
      Spring Data Redis
      springsecurity
      자바 면접질문
      JS
      CSS
      자바기초
      redis 채팅
      백준
      HTML
      jsp request
      스프링프레임워크
      Springframework
      java
      jsp기초
      레디스
      JSP
      자바 반복문
      프로그래머스
      자바
      Spring
      리눅스마스터2급정리
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [JPA] Soft Delete 개발 방법(Hard Delete과의 차이)
    상단으로

    티스토리툴바