Spring scheduler을 이용한 soft delete 일괄 제거

bw1611·2024년 3월 2일

프로젝트를 진행하면서 soft delete를 적용한 경험이 있다.
사용자가 삭제하지만 실제로는 DB에서 삭제되지 않고 상태만 바뀌는 것을 soft delete라고 한다. 하지만 항상 soft delete만 구현하였고 일정 기간이 지나면 DB에서 hard delete를 해본 경험은 없어 시험삼아 구현해보았다.

1,
controller에서 delete 요청을 넣어준다.

    @DeleteMapping("/v1/delete/{postId}")
    public ResponseEntity<Void> delete(@PathVariable Long postId){
        postService.delete(postId);
        return ResponseEntity.status(HttpStatus.OK).build();
    }

2,
service에서 비즈니스 로직을 수행한다.
원래는 예외처리도 해주고 검증 로직도 있어야 하지만 soft delete를 hard delete해보는 것이 목적이라 따로 신경쓰지 않기로하였다.
Id로 post를 찾아서 변경감지 해주었다.

    @Transactional
    public void delete(Long postId) {
        Post post = postRepository.findById(postId)
                .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게시글입니다."));

        post.delete();

        log.info("post status = {}", post.getStatus());
    }

3,
domain에서 따로 변경감지 해주었다. (변경 감지가 맞겠지..?)

    public void delete() {
        this.status = Status.DEAD;
        this.deletedAt = LocalDateTime.now();
    }

4,

Spring의 scheduling을 이용하여 새벽 1시마다 삭제해주도록 처리하였다.
나는 삭제 기준일로 7일이 지난 게시글들을 삭제해주었다.
이랬더니 JPA를 통하여 7일이 지난 게시글들을 리스트로 가져와서 한번에 delete 시켜주는 것을 확인할 수 있었다. (물론 실험할때는 2분이 지난 것으로 했었다..)

    @Transactional
    @Scheduled(cron = "0 0 1 * * ?") // 매 새벽 1시 마다 일괄 제거
    public void performHardDelete() {
        List<Post> softDeletedPosts = postRepository
                .findByStatusAndDeletedAtBefore(Status.DEAD, LocalDateTime.now().minusDays(7)); // DeletedAt을 기준으로 7일이 지난 게시글 삭제

        postRepository.deleteAll(softDeletedPosts);
    }
profile
Java BackEnd Developer

0개의 댓글