728x90
- 스케줄러
정해진 시간마다 지정된 로직을 자동으로 실행하게 하는것
매 시간마다 관심 상품 목록 제목으로 검색해서, 최저가 정보를 업데이트하는 스케줄러 만들기
/*Scheduler.java*/
package com.sparta.week04.utils;
...
@RequiredArgsConstructor // final 멤버 변수를 자동으로 생성합니다.
@Component // 스프링이 필요 시 자동으로 생성하는 클래스 목록에 추가합니다.
public class Scheduler {
private final ProductRepository productRepository;
private final ProductService productService;
private final NaverShopSearch naverShopSearch;
//실행 시각. 초, 분, 시, 일, 월, 주 순서
@Scheduled(cron = "0 0 * * * *") //cron: 정해진 시간에 실행되는 것
public void updatePrice() throws InterruptedException { //오류가 나면 에러메시지를 띄움
System.out.println("----------Scheduler 실행) 가격 업데이트 실행----------");
// 저장된 모든 관심상품을 조회합니다.
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);
}
}
}
package com.sparta.week04.service;
...
@Service
@RequiredArgsConstructor
public class ProductService {
private final ProductRepository productRepository;
...
@Transactional
public Long updateBySearch(Long id, ItemDto itemDto) {
Product product = productRepository.findById(id).orElseThrow(
() -> new NullPointerException("아이디가 존재하지 않습니다")
);
product.updateByItemDto(itemDto);
return product.getId();
}
}
/*product.java*/
package com.sparta.week04.models;
...
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Product extends Timestamped{
...
public void updateByItemDto(ItemDto itemDto) {
this.lprice = itemDto.getLprice();
}
}
@EnableScheduling만 추가
package com.sparta.week04;
...
@EnableScheduling //스프링 부트에서 스케줄러가 작동하게 함
@EnableJpaAuditing //시간 자동 변경 가능하도록 함
@SpringBootApplication //스프링 부트임을 선언
public class Week04Application {
public static void main(String[] args) {
SpringApplication.run(Week04Application.class, args);
}
}
'Spring Framework' 카테고리의 다른 글
나만의셀렉샵) OG 태그 작업하기 (0) | 2021.08.03 |
---|---|
나만의셀렉샵) 최저가 변경 API 완성하기 (0) | 2021.08.02 |
나만의셀렉샵) 관심 상품 보여주기 (0) | 2021.08.01 |
나만의셀렉샵) 관심 상품 등록하기 (0) | 2021.08.01 |
나만의셀렉샵) 상품 검색 기능 만들기 (0) | 2021.07.29 |