Scheduler

seokseungmin·2024년 11월 11일

Today I Learned

목록 보기
15/20

팀 프로젝트를 진행하며 작성된 여행 게시물의 마감기한이 지나면
자동으로 여행 게시물 상태를 모집중에서 모집완료로 바꿔줘야하는 상황 발생.
자동으로 모집기한이 지날때 상태를 어떻게 변환해주지?
스케쥴러를 사용해 보자!

travel 모듈쪽에 설정

@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);
    }
}

PostService에 스케쥴링 추가

	@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초
  • 모든 분마다
  • 모든 시간에
  • 모든 날에
  • 모든 월에
  • 모든 요일에

즉, 매 분의 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)
│ │ │ │ │ │
* * * * * *
  • : 0부터 59까지
  • : 0부터 59까지
  • : 0부터 23까지
  • : 1부터 31까지
  • : 1부터 12까지
  • 요일: 0부터 7까지 (일요일은 0 또는 7)

📌 예시 설명

  • cron = "0 * * * * *"

    • 매 분의 0초에 작업이 실행됩니다.
    • 즉, 매 1분마다 실행됩니다.
  • cron = "0 */5 * * * *"

    • 매 분이 5로 나누어 떨어지는 분의 0초에 작업이 실행됩니다.
    • 즉, 매 5분마다 실행됩니다 (예: 0분, 5분, 10분, ...).

📌 주의사항

  • 스케줄러 설정 시 애플리케이션에 @EnableScheduling 어노테이션이 추가되어 있는지 확인하세요.
  • 크론 표현식을 설정할 때 오타나 공백에 유의하세요.
  • 서버 시간대에 따라 실행 시점이 달라질 수 있으므로, 필요한 경우 시간대를 명시적으로 설정하세요.

스케줄러 리펙토링

profile

0개의 댓글