Java/Spring Boot

Spring boot Scheduler 구현하기

요술공주밍키 2022. 6. 7. 17:53

사내에서 자정에 캠페인의 state 값들을 변경하기 위한 스케줄링 시스템이 필요하여 구현해 보았다.

 

스케줄러 기능 활성화

Spring boot는 지원하는 스케줄러가 존재하기 때문에 간단하게 활용할 수 있다.

기본적으로 프로젝트 Application 안에 @EnableScheduling 어노테이션을 사용하면

기능 활성화를 할 수 있다.

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

 

스케줄러 구현하기

기본적으로 @Scheduled 어노테이션을 메소드에 선언하며 실행 주기를 설정한다.

실행 주기는 cron, fixedDelay, fixedRate 라는 3개의 속성을 지정할 수 있지만

나는 cron을 활용하기로 하였다. 우선 cron 주기 설정 방법이다.

*           *      *      *      *      *
초(0-59)   분(0-59)  시간(0-23)  일(1-31)  월(1-12)  요일(0-7) 
각 별 위치에 따라 주기를 다르게 설정 할 수 있다.
순서대로 초-분-시간-일-월-요일 순이다. 그리고 괄호 안의 숫자 범위 내로 별 대신 입력 할 수도 있다.
요일에서 0과 7은 일요일이며, 1부터 월요일이고 6이 토요일이다.

위와 같은 방법으로 주기를 지정해주는데 우리는 자정에 스케줄러를 작동할 것이기 때문에

@Scheduled(cron = "0 0 0 * * *") 이렇게 지정해 주었다.

위 내용은 365일 내내 0시 0분 0초에 스케줄러를 작동하라는 의미이다.

List<Campaign> campaignList = campaignRepository.findAll();
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;

cronJobSch이라는 메소드의 첫 부분을 가져왔다.

List<Campaign> campaignList = campaignRepository.findAll();

우리는 캠페인의 state를 변경하기 위하여 캠페인 리스트를 전부 불러온다.

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;

이후 DB에 존재하는 시간 포맷과 비교할 시간의 포맷이 일치하지 않아 포맷팅을 해주었다.

if(campaign.getCampaignReview().getSelectedDt().format(formatter).equals(now.format(formatter)))

위 형식처럼 시간을 맞춘 뒤 비교하여 일치하는 내용으로 원하는 내용을 작성하면 된다.