[Spring] 매월 말일 스프링 스케줄러 실행

Q0. 개요

내가 해보았던 배치에는 두 가지 종류가 있다.

1. DB단에서 만들어주는 배치가 있고

2. 스프링에서 제공되는 스케줄러가 있다.

 

스프링에서 제공되는 @Scheduled 어노테이션을 이용하여 매월 말일 스케줄러를 작성하려고 한다.

//매월 말일 23시 59분
//@Scheduled(cron="0 59 23 last * *")
@Scheduled(cron="0 55 23 L * ?")
public void Solution() throws Exception {		
	log.info("Solution==> Start");
}

 

Q1. 여기서 Cron 표현식이란

task가 실행되는 시간/주기 등을 설정하는 Unix계열 운영체제의 작업 스케줄러라고 한다.

 

대부분의 크론식은 비슷하지만, 환경에 따라 조금씩 다르다.

아래는 스프링 스케줄러의 크론 표현식은 아래와 같다.

@Schduled(cron="0 55 23 L * ?")는 0초 55분 23시 말일.

그런대 톰캣 실행시 에러가 발생하게 된다.

11월 21, 2023 10:43:36 오전 org.apache.catalina.core.StandardContext loadOnStartup 심각: 웹 애플리케이션 [/daelimcorp] 내의 서블릿 [appServlet]이(가) load() 예외를 발생시켰습니다. java.lang.IllegalStateException: Encountered invalid @Scheduled method 'Solution': For input string: "L"

확인해보니까 말일을 표현하는 L 표현식은 환경에 따라 기능이 지원되지 않을 수 있다고 한다.

@Schduled에서는 기능이 지원되지 않는거로 보였다.

 

Q2. 결론적으로

매일 배치를 돌면서 비즈니스 로직에서 오늘 날짜가 말일인지를 체크하는 로직을 아래와 같이 추가하였다.

//매월 말일 23시 59분
@Scheduled(cron="0 55 23 * * ?")
public void Solution() throws Exception {
	log.info("Solution==> Ready");
	YearMonth currentYearMonth = YearMonth.now();
	LocalDate lastDayOfMonth = currentYearMonth.atEndOfMonth();
	LocalDate currentDate = LocalDate.now();
	//이달 말일 체크
	if (currentDate.equals(lastDayOfMonth)) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		
		//오늘이 이달의 말일이라면 주요 업무 START
	}
	log.info("Solution ==> End");
}