본문 바로가기
스프링 (Spring)/SelectShop Project

Selectshop - 스케쥴러

by 후닝훈 2021. 8. 3.
반응형

스케쥴러

 

요구사항

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

- src > main > java > week04 > utils > Scheduler.java 생성

 

Scheduler.java 

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

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

    // cron과의 시간이 일치할 때 스케쥴링이 시작된다.
    // 초, 분, 시, 일, 월, 주 순서
    // * 은 무엇이든 상관없다는 뜻이다.
    @Scheduled(cron = "0 0 1 * * *")
    public void updatePrice() throws InterruptedException {
        System.out.println("가격 업데이트 실행");
        // 저장된 모든 관심상품을 조회합니다.
        List<Product> productList = productRepository.findAll();
        for (int i=0; i<productList.size(); i++) {
            // 1초에 한 상품 씩 조회합니다 (너무빠르면 네이버에서 제한한다.)
            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);
        }
    }
}

 

ProductService 수정

    @Transactional // 메소드 동작이 SQL 쿼리문임을 선언합니다.
    public Long updateBySearch(Long id, ItemDto itemDto) {
        Product product = productRepository.findById(id).orElseThrow(
                () -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
        );
        product.updateByItemDto(itemDto);
        return id;
    }

 

Product 수정

    // 스케쥴러에 의한 업데이트
    public void updateByItemDto(ItemDto itemDto) {
        this.lprice = itemDto.getLprice();
    }

 

Application 수정

@EnableScheduling // 스프링 부트에서 스케줄러가 작동하게 함

 

 

반응형

댓글