Scheduler

김나영·2023년 7월 11일
0

Spring

목록 보기
36/38

Scheduler란?

  • 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 하기 위해 사용

  • @Scheduled 규칙

    • Method는 void 타입으로

    • Method는 매개변수 사용 불가

사용법

Schedule 기능 켜기

  • @EnableScheduling 추가
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
 
}
  • @EnableScheduling : 스프링 부트에서 스케줄러가 작동하게 함

Schedule 적용

  • 스케줄링을 원하는 메서드에 @Scheduled Annotation을 붙여줌

  • 해당 클래스는 @Component 즉, 스프링 빈에 등록된 클래스여야 함

@Slf4j(topic = "Scheduler") // 로그 찍기 위해 사용
@Component
@RequiredArgsConstructor
public class Scheduler {

    private final NaverApiService naverApiService; // 해당하는 목록을 다시 재검색
    private final ProductService productService; // 검색해야할 Product의 목록
    private final ProductRepository productRepository;

    // 초, 분, 시, 일, 월, 주 순서

    // @Scheduled 지정한 특정 시간마다 메서드가 동작
    @Scheduled(cron = "0 0 1 * * *") // 매일 새벽 1시
    // cron : 어떤 특정 시간마다 어떤 작업을 자동 수행하게 하고 싶을 때 사용
    public void updatePrice() throws InterruptedException {
        log.info("가격 업데이트 실행");
        List<Product> productList = productRepository.findAll(); // 재검색 해야할 Product 목록
        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(); // for문을 돌았던 product의 id
                try {
                    productService.updateBySearch(id, itemDto);
                } catch (Exception e) {
                    log.error(id + " : " + e.getMessage());
                }
            }
        }
    }

}

0개의 댓글