사내에서 자정에 캠페인의 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)))
위 형식처럼 시간을 맞춘 뒤 비교하여 일치하는 내용으로 원하는 내용을 작성하면 된다.
'Java > Spring Boot' 카테고리의 다른 글
Spring boot RestAPI 파일 다운로드 (0) | 2023.02.10 |
---|---|
Spring boot Controller Zip 압축 해제 (0) | 2023.01.25 |
Spring boot H2 DB 설정 (0) | 2022.11.10 |
[Spring boot + React] Rest Api 연동하기 (0) | 2022.08.16 |
Spring boot 패키지 구조 및 내용 (0) | 2022.02.22 |