본문 바로가기

내일 배움 캠프

2023-12-21

오늘 플러스 주차 개인과제 3일 차이다. 오늘 한 내용은 다음과 같다.

1. 스케쥴러 기능 구현 및 Comment 페이징 기능 구현

 

1. 오늘은 스케쥴러를 구현해봤다. 스케쥴러는 특정 모듈을 주기적으로 실행해야 될 때 사용하는데 이번 과제에서는 완료처리한 카드가 작성한 지 90일이 지나면 자동으로 삭제처리하는 기능을 위해 구현했다. 

구현 방식은 다음과 같다.

@Scheduled를 통해 사용할 수 있으며 Spring Bean에 등록이 돼있어야 사용이 가능하다. 따라서 @Component를 사용하여 스케쥴러를 사용할 클래스를 빈으로 등록시킨 후 원하는 코드를 작성하면 된다.

package com.sparta.project_todo.scheduler;

import java.time.LocalDateTime;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.sparta.project_todo.todocard.repository.ToDoRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "완료처리된 카드 삭제 Scheduler")
@Component
@RequiredArgsConstructor
public class Scheduler {

    private final ToDoRepository toDoRepository;

    // 테스트 코드 5분마다 실행 생성된지 5분 이상된 카드 삭제
    @Scheduled(cron = "0 0/5 * * * *")
    public void expireDeleteCardCheck(){
       log.info("1분이 지난 카드 삭제 실행");
       LocalDateTime currentLocalDateTime = LocalDateTime.now();
       LocalDateTime pastLocalDateTime = currentLocalDateTime.minusMinutes(5);
       toDoRepository.deleteExpireCard(pastLocalDateTime);
    }
}

 

스케쥴러를 구현하기 위해 구글링을 참고했다.

블로그를 참고하여 코드를 작성했고 cron방식을 사용하여 특정 시간 주기마다 작성한 메서드를 실행하도록 했다.

테스트를 위해 코드에서는 5분 주기로 실행하도록 설정했으며, 코드 실행시 현재시간에서 5분을 뺀 값을 Query메서드의 파라미터 값으로 입력하여 호출하였다. 

@Transactional
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query("delete from ToDoCard t where t.createdAt <=:cutoffDateTime AND t.complete = true")
void deleteExpireCard(LocalDateTime cutoffDateTime);

deleteExpireCard를 호출하면 JPQL을 통해 해당하는 카드를 바로 삭제처리하는 과정을 진행한다. 여기서 @Transactional과 @Modifying은 JPA특성상 영속성 접근을 통해 데이터를 제거해야 되기 때문에 사용했다. 사용하지 않으면 QueryExecutionRequestException에러가 발생한다. 따라서 flushAutomatically 옵션을 통해 쿼리 실행 전 지연 저장소의 쿼리를 flush처리하고 clearAutomatically옵션을 통해 삭제 처리 후 영속성 컨텍스트를 비워 DB에 수정된 값이 적용될 수 있게끔 했다. 

테스트를 위해 4개의 카드를 생성하고 2개를 완료처리상태로 데이터베이스에 저장하고 스케쥴러가 실행이 되면 다음과 같이 삭제가 진행된다.

스케쥴러 기능을 구현한뒤 Comment 페이징 처리 기능을 구현했다. 아직 테스트를 진행하지 못한 상황이라 구현만 해놓고 하루를 마무리했다. 구현한 코드 중 Repository에 아래의 JPQL이 정상적으로 작동하는지 테스트해 볼 예정이다.

@Query("select c from Comment c join ToDoCard t on c.toDoCard.id = :cardId where t.complete =false and(t.hidden = true and t.user.id = :userId)")
Slice<Comment> findToDoCardComment(Long cardId, Pageable pageable, Long userId);

 

'내일 배움 캠프' 카테고리의 다른 글

2023-12-25  (0) 2023.12.27
2023-12-22  (0) 2023.12.24
2023-12-20  (0) 2023.12.20
2023-12-19  (0) 2023.12.19
2023-12-18  (1) 2023.12.18