팀 프로젝트를 진행하며 작성된 여행 게시물의 마감기한이 지나면
자동으로 여행 게시물 상태를 모집중에서 모집완료로 바꿔줘야하는 상황 발생.
자동으로 모집기한이 지날때 상태를 어떻게 변환해주지?
스케쥴러를 사용해 보자!
@EnableScheduling // 스케줄링 활성화
package com.zerobase.travel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableFeignClients // FeignClient 활성화
@EnableScheduling // 스케줄링 활성화
public class TravelApplication {
public static void main(String[] args) {
SpringApplication.run(TravelApplication.class, args);
}
}
@Scheduled(cron = "0 0 0 * * *") // 매일 자정에 실행
@Transactional
public void updatePostStatus() {
LocalDate now = LocalDate.now();
// 마감일이 지났고, 상태가 RECRUITING인 게시물 조회
List<PostEntity> postsToUpdate = postRepository.findByDeadlineBeforeAndStatus(now, PostStatus.RECRUITING);
for (PostEntity post : postsToUpdate) {
post.setStatus(PostStatus.RECRUITMENT_COMPLETED);
// 필요한 경우 추가 로직 수행( 더티 체킹으로 변경내영 저장)
}
log.info("마감일이 지난 게시물의 상태를 RECRUITMENT_COMPLETED로 업데이트했습니다. 업데이트된 게시물 수: {}", postsToUpdate.size());
}
여행게시물을 등록하고 마감기한 날짜를 변경하고 크론을 매분으로 설정하고 테스트 해보니 자동으로 모집중 상태에서 모집완료 상태로 바뀌는것을 확인함.
@Scheduled 어노테이션의 크론(cron) 표현식을 다음과 같이 설정하시면 됩니다:
@Scheduled(cron = "0 * * * * *") // 매 1분마다 실행
크론 표현식의 각 필드는 다음 순서와 의미를 가집니다:
초 분 시 일 월 요일
따라서 cron = "0 * * * * *"는 다음을 의미합니다:
즉, 매 분의 0초마다 작업이 실행됩니다.
매 1분마다 실행:
@Scheduled(cron = "0 * * * * *")
매 5분마다 실행:
@Scheduled(cron = "0 */5 * * * *") // 매 5분마다 실행
매 10분마다 실행:
@Scheduled(cron = "0 */10 * * * *") // 매 10분마다 실행
매일 자정에 실행:
@Scheduled(cron = "0 0 0 * * *") // 매일 자정에 실행
크론 표현식은 6개의 필드로 구성되며, 각 필드는 공백으로 구분됩니다:
┌───────────── 초 (0 - 59)
│ ┌───────────── 분 (0 - 59)
│ │ ┌───────────── 시 (0 - 23)
│ │ │ ┌───────────── 일 (1 - 31)
│ │ │ │ ┌───────────── 월 (1 - 12)
│ │ │ │ │ ┌───────────── 요일 (0 - 7) (일요일=0 또는 7)
│ │ │ │ │ │
* * * * * *
cron = "0 * * * * *"
cron = "0 */5 * * * *"
@EnableScheduling 어노테이션이 추가되어 있는지 확인하세요.