기존 수익률 계산 부분
public List<StockPrice> findAllByItmsNmAndYear(String itmsNm, int year) {
LocalDate startDate = LocalDate.of(year, 1, 1);
LocalDate endDate = LocalDate.of(year, 12, 31);
return stockPriceRepository.findByItmsNmAndBasDtBetween(itmsNm, startDate, endDate);
}
public List<Long> getPricesByItmsNmAndYear(String itmsNm, int year) {
List<StockPrice> stockPrices = findAllByItmsNmAndYear(itmsNm, year);
List<Long> clprs = new ArrayList<>();
for(int i = 0 ; i < 12 ; i++) {
clprs.add(0L);
}
stockPrices.forEach(stockPrice -> {
clprs.set(stockPrice.getBasDt().getMonthValue() - 1, stockPrice.getClpr());
});
return clprs;
}
- 다음과 같은 방식으로 특정년도의 데이터를 받아온 후 가공하여서 사용하였다.
- 한개의 주식에 년도에 따라 접근하므로 DB에 접근횟수가 많다.
수정한 부분
계산을 위한 Object
@Getter
@Setter
public class PortfolioStockDTO {
private String name;
private String code;
private Map<String, Long> priceMap;
private double weight;
}
- 가격을 다음과 같이 Map 구조를 이용해서 사용하였다.
가격 가져오기
public List<PortfolioStockDTO> getortfolioStockDTOList(List<String> code, List<Double> weightList) {
List<PortfolioStockDTO> portfolioStockDTOList = new ArrayList<>();
for(String s : code) {
List<StockPriceDTO> stockPrices = stockPriceService.getStockPriceListByCode(s);
Map<String, Long> price = new HashMap<>();
for(StockPriceDTO stockPriceDTO : stockPrices) {
price.put(stockPriceDTO.getDate().toString(), stockPriceDTO.getPrice());
}
portfolioStockDTOList.add(new PortfolioStockDTO(stockPrices.get(0).getName(), s, price, weightList.get(code.indexOf(s))));
}
return portfolioStockDTOList;
}