본문 바로가기

나만의 select shop 만들기

스케줄러 만들기

매일 새벽 1시에 관심 상품 목록 제목으로 검색해서, 최저가 정보를 업데이트 하는 스케줄러 만들기.

 

utils > Scheduler.java

@RequiredArgsConstructor // final 멤버 변수를 자동으로 생성합니다.
@Component // 스프링이 필요 시 자동으로 생성하는 클래스 목록에 추가합니다.
public class Scheduler {

    private final ProductRepository productRepository;
    private final ProductService productService;
    private final NaverShopSearch naverShopSearch;

    // 초, 분, 시, 일, 월, 주 순서
    @Scheduled(cron = "0 0 1 * * *") // cron 실행하는 때 라는 의미
    public void updatePrice() throws InterruptedException { //방해적 요소가 있다고 오류를 띄워라
        System.out.println("가격 업데이트 실행");
        // 저장된 모든 관심상품을 조회합니다.
        List<Product> productList = productRepository.findAll();
        for (int i=0; i<productList.size(); i++) {
            // 1초에 한 상품 씩 조회합니다 (Naver 제한: 너무 자주 실행하면 네이버가 막기때문)
            TimeUnit.SECONDS.sleep(1);
            // i 번째 관심 상품을 꺼냅니다.
            Product p = productList.get(i);
            // i 번째 관심 상품의 제목으로 검색을 실행합니다.
            String title = p.getTitle();
            String resultString = naverShopSearch.search(title);
            // i 번째 관심 상품의 검색 결과 목록 중에서 첫 번째 결과를 꺼냅니다.
            List<ItemDto> itemDtoList = naverShopSearch.fromJSONtoItems(resultString);
            ItemDto itemDto = itemDtoList.get(0);
            // i 번째 관심 상품 정보를 업데이트합니다.
            Long id = p.getId();
            productService.updateBySearch(id, itemDto);
        }
    }
}

service > ProductSersvice.java > updateBySearch

    @Transactional
    public Long updateBySearch (Long id, ItemDto itemDto){
        Product product = productRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
        );
        product.updateByItemDto(itemDto);
        return id;
    }

updateBySearch 는 product 에서 Dto정보를 받아오는 메서드 updateByItemDto가 필요하므로 Product클래스에 가서 메서드를 만들어준다.

 

models > Product.java

    @Transactional
    public Long updateBySearch (Long id, ItemDto itemDto){
        Product product = productRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
        );
        product.updateByItemDto(itemDto);
        return id;

 

마지막으로 스케줄러를 사용할 수 있게

Application 클래스에 어노테이션을 추가해준다. @EnableScheduling

@EnableScheduling
@EnableJpaAuditing //시간 자동 변경이 가능하도록 합니다.
@SpringBootApplication //스프링 부트임을 선언
public class Week04Application {

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

}

 

 

'나만의 select shop 만들기' 카테고리의 다른 글

등록한 관심상품 최저가 설정하기  (0) 2020.12.10
관심 상품 보여주기  (0) 2020.12.08
관심 상품 등록하기  (0) 2020.12.08
상품 검색 기능 만들기  (0) 2020.12.08
HTML, Css, 이미지파일  (0) 2020.12.07