public List<StockInfo> saveAll(Set<StockInfo> stockInfos) {
List<StockInfo> saveStockInfos = new ArrayList<>();
List<StockInfo> savedStockInfos = stockInfoRepository.findAll();
List<String> savedItmsNm = savedStockInfos.stream().map(StockInfo::getItmsNm).toList();
for(StockInfo stockInfo : stockInfos) {
if(!savedItmsNm.contains(stockInfo.getItmsNm())) {
saveStockInfos.add(stockInfo);
}
}
return stockInfoRepository.saveAll(saveStockInfos);
}
다음과 같이 존재하지 않는 것만 모아서 저장하는 saveAll()을 구현하였다. 이로써, 이름이 같은 것은 저장하지 않는다.
단, 이름이 다르지만 종목코드가 다른 것은 저장! (종목명이 바뀐 경우)
public void loadETFPriceByBaseDate(String baseDate) {
JsonArray stockJson = dataPortalApi.getETF(baseDate.substring(0, 6));
if(stockJson == null){
return;
}
List<StockPrice> stockPrices = new ArrayList<>();
Set<StockInfo> stockInfos = new HashSet<>();
for(int i = 0 ; i < stockJson.size() ; i++){
StockPrice stockPrice = new StockPrice();
stockPrice.setItmsNm(stockJson.get(i).getAsJsonObject().get("itmsNm").getAsString());
stockPrice.setSrtnCd(stockJson.get(i).getAsJsonObject().get("srtnCd").getAsString());
stockPrice.setClpr(Math.round(Double.parseDouble(stockJson.get(i).getAsJsonObject().get("clpr").getAsString())));
String basDt = stockJson.get(i).getAsJsonObject().get("basDt").getAsString() + "01";
LocalDate date = LocalDate.parse(basDt, DateTimeFormatter.ofPattern("yyyyMMdd"));
stockPrice.setBasDt(date);
stockPrices.add(stockPrice);
StockInfo stockInfo = new StockInfo();
stockInfo.setItmsNm(stockJson.get(i).getAsJsonObject().get("itmsNm").getAsString());
stockInfo.setSrtnCd(stockJson.get(i).getAsJsonObject().get("srtnCd").getAsString());
stockInfos.add(stockInfo);
}
stockPriceService.saveAll(stockPrices);
stockInfoService.saveAll(stockInfos);
}
다음과 같이 json을 불러와서 stockPrice와 stockInfo를 구성하고 저장하였다.
ETF까지 추가한 결과이다(2020.01. ~ 2024.01.)