반응형
스케쥴러
요구사항
- 매일 새벽 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 // 스프링 부트에서 스케줄러가 작동하게 함
반응형
'스프링 (Spring) > SelectShop Project' 카테고리의 다른 글
Selectshop - OG TAG 작업 (0) | 2021.08.05 |
---|---|
Selectshop - 관심 상품 등록 및 보이기 (0) | 2021.08.03 |
Selectshop - 상품검색기능 (0) | 2021.08.03 |
SelectShop - HTML 구성 (0) | 2021.08.03 |
SelectShop - 키워드로 상품 검색하기2 (0) | 2021.08.03 |
댓글