
NOTE
Content과제 피드백 내용중에 SQLDelete와 SQL Restriction 어노테이션을 알려주셨다 튜터님께 여쭤보니 우린 어차피 BaseEntity에 deletedYN으로 삭제 여부는 따로 관리하고 있었기때문에 그냥 원래방식대로 해도 된다고 하셨지만 새로 알게된 내용이니 공부해본다 😉
soft delete와 hard delete
데이터를 삭제하는 방법은 2가지가 있다
- soft delete : 실제 데이터베이스에서 삭제하는것이 아니라 deleteYN같은 필드를 추가해서 삭제 요청이 들어오면 update로 deleteYN 값을 변경해주는 방식
- hard delete : 데이터베이스에서 실제로 삭제하는 방식
soft delete를 해주면 조회하는 로직을 작성할 때 deleteYN이 false인지 여부도 확인해주어야 한다
@Query("select n from p_notices n where n.id = :noticeId and n.deleted_y = false")
Optional<Notice> findById(UUID noticeId);@SQLDelete
이때 @SQLDelete 어노테이션을 사용하면 delete가 호출될 때 방식을 변경할 수 있다
@SQLDelete(sql = "UPDATE p_notices SET deleted_yn = true WHERE id = ?")먼저 notice entity에 @SQLDelete 어노테이션과 대신 실행시킬 쿼리를 작성해준다
public void deleteNotice(UUID noticeId, String userName) {
try {
Notice notice = noticeRepository.findById(noticeId).orElseThrow(() -> new BaseException(ErrorCode.INVALID_PARAMETER));
// notice.setDeletedYnTrue(userName);
// noticeRepository.save(notice);
noticeRepository.delete(notice);
} catch (Exception e) {
throw new BaseException(ErrorCode.INVALID_PARAMETER);
}
}그리고 기존 코드는 주석처리하고 delete로 수정해주었다


요청을 보내보니 soft delete가 잘 적용된것을 확인할 수 있었다 !
public void setDeletedYnTrue(String userName) {
this.deletedYn = true;
this.deletedAt = LocalDateTime.now();
this.deletedBy = userName;
}원래 base entity로 사용하던 방법이랑 어떤게 더 나은방법인지… 🤔