포트폴리오 서비스(저장한 포트폴리오 조회하기)

·2024년 3월 8일
0

Portfolio Backtest

목록 보기
23/31

페이지 구성하기

다음 2가지의 페이지로 구성하였다.

  • 포트폴리오 리스트를 출력하는 페이지
  • 포트폴리오를 상세하게 출력하는 페이지

portfolio_index.html

    <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으로 저장하였다.

portfolio_compositions

기존에 있던 포트폴리오 백테스트 페이지를 활용해서 작성하였다.


Controller 구성하기

포트폴리오 리스트 가져오기

    @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";
    }
    

backtest 요청

    @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";
    }
    

update 요청

    @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";
    }
    

delete 요청

    @PostMapping("/delete")
    public String deletePortfolio(@RequestParam Long portfolioId) {
        Portfolio portfolio = portfolioService.getPortfolio(portfolioId);
        portfolioCompositionService.deleteAll(portfolio);
        portfolioService.delete(portfolioId);

        return "redirect:/portfolio";
    }
    
profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보