@Scheduled 사용하기 | 자동 수행 scheduler 만들기

qpwoeiru·2024년 5월 6일
0
post-thumbnail

동행을 구하는 게시글에서 일정의 날짜가 지났으면 자동으로 마감 처리하는 요구 사항이 있다. 서버 측에서 동행 일정 날짜가 현재 날짜보다 지난 게시글들을 매일 확인해 게시글의 마감 상태를 업데이트 해야 하는데, 이를 스케줄러로 만들고자 한다.


스케줄러 요구사항

게시글의 자동 마감을 위해 스케줄러가 수행될 적절한 시간대를 정해보자.

  • 스케줄러가 수행될 시간 간격은?
    • 1시간 마다 : 당일 동행 약속이 가능하므로 X
    • 매일 : 당일 약속이 가능함을 고려해 매일 정각에 하는 것이 최선으로 판단
      • 게시글 작성 시점 당일에 대한 게시글 작성이 가능한가?
        => O : 식사 목적의 동행인 경우가 있으므로 가능

스케줄러 구현하기

@EnableScheduling

스케줄러가 정상 작동하기 위해 필수로 추가해야 하는 어노테이션이다. 꼭 SpringBootApplication이 선언된 패키지 및 하위 패키지에 선언이 되어야 정상 작동한다. 스케줄러 메서드를 생성해도 @EnableScheduling을 등록하지 않으면 정상 작동 하지 않는다. 나는 SpringBootApplication에 선언했다.

@EnableScheduling
@SpringBootApplication
public class ServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ServerApplication.class, args);
	}
}

@Scheduled

특정 메서드가 일정 주기마다 실행되어야 할 때, 또는 특정 시간에 실행되어야 할 때 @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(토))")
  • cron 예시
    • @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

0개의 댓글

관련 채용 정보