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로 사용하던 방법이랑 어떤게 더 나은방법인지… 🤔