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를 쓰고 있다.
'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 |