부트캠프 질의응답 시간에 엔지니어분께서
'현업에 가면 Hard Delete와 Soft Delete를 알고 적용해야 할 때가 있습니다.'
라고 말씀하신게 기억에 남아 '이게 뭐지?' 하면서 찾게 되었고 직접 구현을 해보고
기록을 남기고자 글을 씁니다.
지금까지는 JPA의 delete를 생각없이 사용했습니다.
앞으로는 생각하고 요구사항에 맞게 구현할 수 있도록 하겠습니다.
@Getter
@SQLDelete(sql = "UPDATE MEMBER SET deleted_at = CURRENT_TIMESTAMP WHERE MEMBER_ID = ?")
@Where(clause = "deleted_at IS NULL")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member extends Timestamped {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long memberId;
.........
@SQLDelete 어노테이션은 Delete 쿼리가 발생할 때, 정의된 특정 쿼리로 바꿔서 실행시켜줍니다.
Delete 쿼리가 발생할때 delete = true Update 쿼리가 발생하도록 합니다.
@Where 어노테이션은 Select 쿼리가 발생할 때, 정의된 where 구문이 Default 옵션으로 추가돼서 실행됩니다.
entity를 Select하는 모든 Select 쿼리에 where deleted_at IS NULL 구문이 추가되면서 삭제되지 않은 Entity만 조회될 수 있도록 합니다.
결과
주의해야할 것은 삭제된 데이터를 가져올 때에는 어떻게 할 것인가다.
@Where 어노테이션을 통해 편리성은 높아졌지만 삭제되지 않는 데이터만 가져오게 된다.
이 같은 문제가 있을 땐 @FilterDef 를 사용하면 된다. 추후에 블로깅 하도록 하겠다.
참고 문헌
https://thalals.tistory.com/302
https://velog.io/@jsb100800/Spring-boot-JPA-Soft-Delete-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0