1. 스케줄러 만들기
- 매일 새벽 1시에 관심 상품 목록 제목으로 검색해서, 최저가 정보를 업데이트하는 스케줄러를 생성
Scheduler 클래스
- Scheduler.java (src > main > java > com.sparta.week04 > utils)
package com.sparta.week04.utils;
import com.sparta.week04.models.ItemDto;
import com.sparta.week04.models.Product;
import com.sparta.week04.models.ProductRepository;
import com.sparta.week04.service.ProductService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
@Component
public class Scheduler {
private final ProductRepository productRepository;
private final ProductService productService;
private final NaverShopSearch naverShopSearch;
@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++) {
TimeUnit.SECONDS.sleep(1);
Product p = productList.get(i);
String title = p.getTitle();
String resultString = naverShopSearch.search(title);
List<ItemDto> itemDtoList = naverShopSearch.fromJSONtoItems(resultString);
ItemDto itemDto = itemDtoList.get(0);
Long id = p.getId();
productService.updateBySearch(id, itemDto);
}
}
}
ProductService 클래스 개선
package com.sparta.week04.service;
import com.sparta.week04.models.ItemDto;
import com.sparta.week04.models.Product;
import com.sparta.week04.models.ProductMypriceRequestDto;
import com.sparta.week04.models.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@RequiredArgsConstructor
@Service
public class ProductService {
private final ProductRepository productRepository;
@Transactional
public Long update(Long id, ProductMypriceRequestDto requestDto) {
Product product = productRepository.findById(id).orElseThrow(
() -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
);
product.update(requestDto);
return id;
}
@Transactional
public Long updateBySearch(Long id, ItemDto itemDto){
Product product = productRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다")
);
product.updateByItemDto(itemDto);
return id;
}
}
Applicatioon 개선
package com.sparta.week04;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@EnableJpaAuditing
@SpringBootApplication
public class Week04Application {
public static void main(String[] args) {
SpringApplication.run(Week04Application.class, args);
}
}
2. 최저가 변경 만들기
setMyprice 만들기
function setMyprice() {
let myprice = $('#myprice').val();
if (myprice == '') {
alert('올바른 가격을 입력해주세요');
return;
}
$.ajax({
type: "PUT",
url: `/api/products/${targetId}`,
contentType: "application/json",
data: JSON.stringify({myprice: myprice}),
success: function (response) {
$('#container').removeClass('active');
alert('성공적으로 등록되었습니다.');
window.location.reload();
}
})
}
ProductRestController 개선
package com.sparta.week04.controller;
import com.sparta.week04.models.Product;
import com.sparta.week04.models.ProductMypriceRequestDto;
import com.sparta.week04.models.ProductRepository;
import com.sparta.week04.models.ProductRequestDto;
import com.sparta.week04.service.ProductService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RequiredArgsConstructor
@RestController
public class ProductRestController {
private final ProductRepository productRepository;
private final ProductService productService;
@GetMapping("/api/products")
public List<Product> getProducts() {
return productRepository.findAll();
}
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto) {
Product product = new Product(requestDto);
productRepository.save(product);
return product;
}
@PutMapping("/api/products/{id}")
public Long updateProduct(@PathVariable Long id, @RequestBody ProductMypriceRequestDto requestDto) {
return productService.update(id, requestDto);
}
}