HardDelete 와 SoftDelete 가 있다.
HardDelete는 삭제 요청이 오면 DB에서 바로 삭제를 한다.
SoftDelete는 삭제 요청이 오면 바로 삭제 처리를 하지 않고, 삭제 플래그를 표시해두어 DB에는 남겨둔다.
많은 SoftDelete 구현 방법이 있지만, 나는 datetime을 nullable로 두어 null이 아닌, 날짜가 기입되면 삭제처리를 한 것으로 두어 삭제 시간을 알 수 있도록 했다.
나중에 배치로 일주일의 간격을 두고 실제로 삭제할 예정이다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@Column(name = "created_at", updatable = false)
@CreatedDate
private LocalDateTime createdAt;
@Column(name = "modified_at")
@LastModifiedDate
private LocalDateTime modifiedAt;
}
생성일자와 수정일자를 담은 기반 엔티티를 만들고,
@Getter
@MappedSuperclass
public abstract class SoftDeleteEntity extends BaseEntity {
@Column(name = "deleted_at")
private LocalDateTime deletedAt;
// deletedAt 필드가 null이면 삭제 안 된 상태이고, 날짜가 있다면 삭제 날짜.
public void softDelete() {
this.deletedAt = LocalDateTime.now();
}
}
이를 상속받아 소프트 삭제를 명시하는 엔티티를 만들었다.
기본값은 null로 저장이 되었다가, 삭제 처리(softDelete 메서드 실행)가 되면 현재 시간을 넣어서 삭제 처리를 하면서도 언제 삭제가 되었는지를 알 수 있게 했다.
다만 이렇게 하면 user를 가져올 때마다 매번 WHERE deleted_at IS NULL 조건을 추가해주어야 하는데, 이를 어노테이션으로 대신할 수 있다.
@Getter
@Entity
@Table(name = "users")
@SQLRestriction("deleted_at IS NULL") // 여기 추가
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends SoftDeleteEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
}
@SQLRestriction 어노테이션을 이용하면 내부의 문자열을 추가하여 쿼리를 날린다.
예전 블로그 글을 보면 @Where 어노테이션을 이용하는 것을 볼 수 있는데, 하이버네이트 6.3 버전 부터 Deprecated 되었다.
(스프링 부트 3.2.6 버전 기준으로 하이버네이트 6.4.8 버전을 사용한다)
[Hibernate]
select
u1_0.id,
u1_0.created_at,
u1_0.deleted_at,
u1_0.modified_at
from
users u1_0
where
(
u1_0.deleted_at IS NULL
)
and u1_0.nickname=?
where 절을 보면
(
u1_0.deleted_at IS NULL
)
처리가 된 것을 볼 수 있다.
'TIL ✍️' 카테고리의 다른 글
24년 6월 24일(월요일) - 86번째 TIL : Querydsl 일대다 조회 시 중복 요소 처리 (0) | 2024.06.24 |
---|---|
24년 6월 22일(토요일) - 85번째 TIL : 요청 DTO 검증 시 정규표현식으로 하기 (0) | 2024.06.23 |
24년 6월 18일(화요일) - 83번째 TIL : Access token, Refresh token 응답 및 저장 방식 (1) | 2024.06.18 |
24년 6월 17일(월요일) - 82번째 TIL : JJWT 0.11.5 -> 0.12.5 변경점 (0) | 2024.06.17 |
24년 6월 16일(일요일) - 81번째 TIL : Failed to Connect to MySQL at 127.0.0.1 with user root (0) | 2024.06.16 |