[Spring] Scheduler

thingzoo·2023년 7월 10일
0

Spring

목록 보기
47/54
post-thumbnail

스케줄러란?

일정한 시간 간격 또는 일정한 시각에 특정 로직을 돌리기 위해 사용하는 것

  • 배치를 구현하기 위해서는 스케줄러를 사용해야 함 → 배치와 스케줄러는 비교 대상이 아님!
  • Spring에서 제공하는 스케줄러
    • Spring Scheduler
    • Spring Quartz

Spring Scheduler는 SpringBoot Stater에서 기본적으로 제공한다.

사용법

스케쥴러 활성화

앱 클래스에 @EnableScheduling 추가

@EnableScheduling // 스프링 부트에서 스케줄러가 작동하게 합니다.
@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

스케쥴러 적용

스케줄링을 원하는 메서드에 @Scheduled 어노테이션을 붙여주면 된다.
스케줄링을 할 메서드는 아래 두 개의 조건을 만족해야 한다.

  • return type이 void일 것
  • parameter가 없을 것
@Component
@RequiredArgsConstructor
public class Scheduler {

    private final NaverApiService naverApiService;
    private final ProductService productService;
    private final ProductRepository productRepository;

    // 초, 분, 시, 일, 월, 주 순서
    @Scheduled(cron = "0 0 1 * * *") // 매일 새벽 1시
    public void updatePrice() throws InterruptedException {
        log.info("가격 업데이트 실행");
        List<Product> productList = productRepository.findAll();
        for (Product product : productList) {
            // 1초에 한 상품 씩 조회합니다 (NAVER 제한)
            TimeUnit.SECONDS.sleep(1);

            // i 번째 관심 상품의 제목으로 검색을 실행합니다.
            String title = product.getTitle();
            List<ItemDto> itemDtoList = naverApiService.searchItems(title);

            if (itemDtoList.size() > 0) {
                ItemDto itemDto = itemDtoList.get(0);
                // i 번째 관심 상품 정보를 업데이트합니다.
                Long id = product.getId();
                try {
                    productService.updateBySearch(id, itemDto);
                } catch (Exception e) {
                    log.error(id + " : " + e.getMessage());
                }
            }
        }
    }

}

Cron Expression

Reference

🔗 https://velog.io/@smallcherry/%EB%B0%B0%EC%B9%98%EC%99%80-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%9F%AC

나중에 더 추가하도록 하자...

profile
공부한 내용은 바로바로 기록하자!

0개의 댓글