다음 2가지의 페이지로 구성하였다.
<div class="px-3 mb-1 py-1" th:each="portfolio : ${portfolios}">
<form th:action="@{/portfolio/compositions}" method="post">
<input type="hidden" th:name="portfolioId" th:value="${portfolio.id}">
<div class="row">
<div class="col">
<input type="hidden" th:name="portfolioName" th:value="${portfolio.portfolioName}">
<span th:text="${portfolio.portfolioName}"></span>
</div>
<div class="col">
<span th:text="${portfolio.description}"></span>
</div>
<div class="col ">
<input type="submit" value="상세보기" class="btn btn-secondary">
<input type="submit" value="삭제" class="btn btn-dark" onclick="javascript: form.action='/portfolio/delete';"/>
</div>
</div>
</form>
</div>
다음과 같이 portfolios를 받아와 출력하였다. 삭제 및 상세페이지에 portfolioId가 필요하기 때문에 hidden으로 저장하였다.
기존에 있던 포트폴리오 백테스트 페이지를 활용해서 작성하였다.
@GetMapping("")
public String getPotfolios(Principal principal, Model model) {
if(principal == null) {
return "redirect:/login";
}
List<Portfolio> portfolios = portfolioService.getPortfoliosByUser(siteUserService.getUser(principal.getName()));
model.addAttribute("portfolios", portfolios);
return "portfolio_index";
}
@PostMapping("/compositions")
public String getPortfolio(@RequestParam Long portfolioId, @RequestParam String portfolioName, Model model) {
Portfolio portfolio = portfolioService.getPortfolio(portfolioId);
List<PortfolioComposition> portfolioCompositions = portfolioCompositionService.getPortfolioCompositions(portfolio);
model.addAttribute("count", portfolioCompositions.size());
model.addAttribute("portfolio", portfolio);
model.addAttribute("portfolioId", portfolioId);
for(int i = 0 ; i < portfolioCompositions.size() ; i++) {
model.addAttribute("stock" + (i + 1), portfolioCompositions.get(i).getItmsNm() + " (" + portfolioCompositions.get(i).getSrtnCd() + ")");
model.addAttribute("weight" + (i + 1), portfolioCompositions.get(i).getAllocation());
model.addAttribute("id" + (i + 1), portfolioCompositions.get(i).getId());
}
return "portfolio_compositions";
}
@PostMapping("/backtest")
public String backtest(@RequestParam Long portfolioId, Model model) {
Portfolio portfolio = portfolioService.getPortfolio(portfolioId);
List<PortfolioComposition> portfolioCompositions = portfolioCompositionService.getPortfolioCompositions(portfolio);
model.addAttribute("count", portfolioCompositions.size());
model.addAttribute("startAmount", 10000000);
model.addAttribute("totalRor", 0.0);
for(int i = 0 ; i < portfolioCompositions.size() ; i++) {
model.addAttribute("stock" + (i + 1), portfolioCompositions.get(i).getItmsNm() + " (" + portfolioCompositions.get(i).getSrtnCd() + ")");
model.addAttribute("weight" + (i + 1), portfolioCompositions.get(i).getAllocation());
}
return "backtest_portfolio";
}
@PostMapping("/update")
public String updatePortfolio(@RequestParam Map<String, Object> portfolio, Principal principal) {
if(principal == null) {
return "redirect:/login";
}
String portfolioName = (String) portfolio.get("portfolioName");
String description = (String) portfolio.get("description");
List<String> itmsNmList = new ArrayList<>();
List<String> srtnCdList = new ArrayList<>();
List<String> stockWeightList = new ArrayList<>();
List<Long> idList = new ArrayList<>();
portfolio.forEach((k, v) -> {
if (k.contains("stock")) {
int indexOfParenthesis = ((String) v).lastIndexOf('(');
itmsNmList.add(((String) v).substring(0, indexOfParenthesis - 1).trim());
srtnCdList.add(((String) v).substring(indexOfParenthesis + 1, ((String) v).length() - 1));
}
if(k.contains("weight")) {
stockWeightList.add((String) v);
}
if(k.contains("id")) {
idList.add(Long.parseLong((String) v));
}
});
String username = principal.getName();
SiteUser siteUser = siteUserService.getUser(username);
Portfolio portfolio1 = new Portfolio();
portfolio1.setPortfolioName(portfolioName);
portfolio1.setDescription(description);
portfolio1.setUsername(siteUser);
portfolio1.setId(Long.parseLong((String) portfolio.get("portfolioId")));
List<PortfolioComposition> portfolioCompositionList = new ArrayList<>();
for(int i = 0 ; i < itmsNmList.size() ; i++) {
PortfolioComposition portfolioComposition = new PortfolioComposition();
portfolioComposition.setItmsNm(itmsNmList.get(i));
portfolioComposition.setSrtnCd(srtnCdList.get(i));
portfolioComposition.setAllocation(Double.parseDouble(stockWeightList.get(i)));
portfolioComposition.setId(idList.get(i));
portfolioComposition.setPortfolio(portfolio1);
portfolioComposition.setId(idList.get(i));
portfolioCompositionList.add(portfolioComposition);
}
portfolioService.save(portfolio1);
portfolioCompositionService.saveAll(portfolioCompositionList);
return "redirect:/portfolio";
}
@PostMapping("/delete")
public String deletePortfolio(@RequestParam Long portfolioId) {
Portfolio portfolio = portfolioService.getPortfolio(portfolioId);
portfolioCompositionService.deleteAll(portfolio);
portfolioService.delete(portfolioId);
return "redirect:/portfolio";
}