동행을 구하는 게시글에서 일정의 날짜가 지났으면 자동으로 마감 처리하는 요구 사항이 있다. 서버 측에서 동행 일정 날짜가 현재 날짜보다 지난 게시글들을 매일 확인해 게시글의 마감 상태를 업데이트 해야 하는데, 이를 스케줄러로 만들고자 한다.
게시글의 자동 마감을 위해 스케줄러가 수행될 적절한 시간대를 정해보자.
스케줄러가 정상 작동하기 위해 필수로 추가해야 하는 어노테이션이다. 꼭 SpringBootApplication이 선언된 패키지 및 하위 패키지에 선언이 되어야 정상 작동한다. 스케줄러 메서드를 생성해도 @EnableScheduling
을 등록하지 않으면 정상 작동 하지 않는다. 나는 SpringBootApplication에 선언했다.
@EnableScheduling
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
특정 메서드가 일정 주기마다 실행되어야 할 때, 또는 특정 시간에 실행되어야 할 때 @Scheduled
어노테이션을 붙인다. @Scheduled
어노테이션이 붙은 메서드의 클래스는 스프링 빈에 추가되어 있어야 한다. (ex : @Service
, @Component
등..)
@Scheduled
의 속성에는 해당 메서드가 언제 수행될 것인지를 표시한다. fixedDelayString, fixedRate, initialDelay, cron 등 속성으로 들어갈 수 있는 것이 많지만 나는 cron 표현식을 사용했다.
cron 표현식의 의미는 아래와 같다.
@Scheduled(cron = "초(0~59) 분(0~59) 시간(0~23) 일(1~31) 월(1~12) 요일(0(일) ~ 6(토))")
@Scheduled(cron = “0 0/5 * * * *”)
: 5분에 한 번씩 수행@Scheduled(cron = “0 0 0/1 * * *”)
: 1시간에 한 번씩 수행@Scheduled(cron = “0 0 0 1 * *”)
: 매달 1일 자정에 수행나는 매일 자정에 수행하므로 @Scheduled(cron = "0 0 0 * * *")
으로 구현했다.
@Scheduled(cron = "0 0 0 * * *")
public void checkDeadlineReached(){
LocalDate curDate = LocalDate.now();
List<Board> boards = boardRepository.findByScheduleStartDateBefore(curDate);
// 일정의 시작 날짜가 지난 게시글들에 대해 자동 마감 처리
if(!boards.isEmpty()){
for(Board board : boards){
board.updateDeadlineReached(true);
}
}
log.info("checked deadlines");
}
참고
https://dev-coco.tistory.com/176
https://filltheemptyspace.tistory.com/15