2018-4-10 TDD를 이용한 로또 4단계구현

로또4단계

리팩토링 전

post("/buyLotto", (req, res) -> {
            int num = (Integer.parseInt(req.queryParams("inputMoney")) / 1000);
            List<String> manualNum = Arrays.asList(req.queryParams("manualNumber").split("\r?\n"));
            int autoNum = num - manualNum.size();
            Input input = new Input();
            lottos = input.makeLottos(autoNum);
            input.addManualLottos(manualNum);
            Map<String, Object> model = new HashMap<>();
            model.put("num", num);
            model.put("lottos", lottos);
            return render(model, "/show.html");
        });

        post("/matchLotto", (req, res) -> {
            Map<String, Object> model = new HashMap<>();
            Lotto winningNumber = new Lotto(req.queryParams("winningNumber"));
            String bonusNumber = req.queryParams("bonusNumber");
            Money money = new Money();
            Decision decision = new Decision();
            int inputMoney = lottos.size() * 1000;
            int profit = money.profit(money.totalMoney(decision.decisionRank(lottos, winningNumber, bonusNumber)), inputMoney);
            HashMap<Rank, Integer> finalCount = money.money(decision.decisionRank(lottos, winningNumber, bonusNumber));
            model.put("profit", profit);
            model.put("moeny", money);
            return render(model, "/result.html");
        });
  • buyLotto에 대한 부분을 밑에와 비교를 했을때 크게 달라진것은 없고 인자를 전달을 하는 과정에서 조금 줄었을 뿐이다.
  • matchLotto에 대한 부분에서 리팩토링의 효과를 봤다. 특히 리팩토링전에는 Money, decision객체를 만들고 호출을 하고 이익을 구하고 등수를 과정이 매우복잡했다.

리팩토링 후

 post("/buyLotto", (req, res) -> {
            List<String> manualNum = Arrays.asList(req.queryParams("manualNumber").split("\r?\n"));
            WebBuy webBuy = new WebBuy();
            webBuy.webAutoBuy(((Integer.parseInt(req.queryParams("inputMoney")) / 1000) - manualNum.size()));
            webBuy.webManualBuy(manualNum);
            Map<String, Object> model = new HashMap<>();
            List<Lotto> lottos = webBuy.getLottos();
            LottoDAO lottoDao = new LottoDAO();
            lottoDao.lottosInserting(lottos);
            model.put("num", (Integer.parseInt(req.queryParams("inputMoney")) / 1000));
            model.put("lottos", lottos);
            return render(model, "/show.html");
        });

        post("/matchLotto", (req, res) -> {
            Map<String, Object> model = new HashMap<>();
            LottoDAO lottoDao = new LottoDAO();
            LottoGame game = new LottoGame(lottoDao.readLottos());
            WinningLotto winningLotto = new WinningLotto(new Lotto(req.queryParams("winningNumber")), Integer.parseInt(req.queryParams("bonusNumber")));
            Result result = game.match(winningLotto);
            RankDAO rankDao = new RankDAO();
            rankDao.insert(result);
            model.put("result", result);
            return render(model, "/result.html");
        });

  • buyLotto에서 로또를 구매하는 과정을 WebBuy라는 클래스를 따로 만들어서 진행을 했다. WebBuy에는 자동구매와 수동구매에 대한 메소드를 구현을 해서 Lottos를 반환해주는 역할을 한다. 이전에 buyLotto객체에서는 생성자를 통해서 Lottos를 반환을 해줬지만 여기서는 생성자를 통해서 객체를 생성할때, Lottos를 반환해주지 않아서 직접 객체를 생성하고 메소드를 호출하는 방식으로 Lottos를 담았다.
  • LottoDao를 통해서 Lottos에 담긴 로또객체들을 DB에 직접저장을 했다.
  • matchLotto에서 LottoGame객체를 했고 여기서는 List<Lotto> lottos를 인자로 받고 WinningLotto와 비교를 해서 match된 결과를 Result객체로 반환을 해준다.
  • Result객체에는 List<Rank> ranks를 반환을 해주는데, ranks를 이용을 해서 등수부터 시작해서 이익 수익률까지 모든것을 한번에 처리를 할 수 있게 구현을 했다.

오늘의느낀점

  • 4단계를 구현을 하면서 느낀점은 WebMain의 역할이 굉장히 단순해졌고, 단지 객체와 객체사이의 조율만 할 뿐 크게 역할을 하는 것은 없었다. 이전에 Main문을 구현을 했을때는 중간에 직접동작을 하고 인스턴스변수를 많이 생성을 했는데, 새로 구현을 할때는 인스턴스변수를 되도록 사용하기보다는 대부분 객체들을 호출을 해서 인자로 전달을 했다. 그러다보니 많이 심플해졌다. 특히 생성자에 대한 부분을 많이 활용을 했다. 생성자를 통해서 인자를 전달을 하게 되면 그 객체안에 이미 전달된 인자들이 있기때문에 해당 클래스에서 메소드를 생성할때, 인자로 전달을 할 수 있는 부분을 줄여나아갔다. 리팩토링전에는 등수를 구하거나 이익을 구하기위해서 많은 객체들을 생성을 했고 메소드들을 호출할때 인자로 많은 값들을 전달을 하게됬다. 하지만 테스트코드 기반으로 작성을 하다보니 전달할 인자를 굉장히 줄여나가게 되었다. 그러다보니 자연스럽게 메소드가 단순해지고 할 역할들이 명확해졌다. 이전에는 Main문에서 수동으로 테스트를 많이 진행을 했는데, TDD기반으로 개발을 하고 나서는 우선 테스트코드들부터 다 동작을 시킨다음에 Main문에서는 테스트를 통과한 메소드들을 그저 나열을 하면됬다. 1,2,3단계까지는 이미 통과를 했었기에 다시 구현을 했을때 빨리 통과를 했다고 생각을 했지만, 4단계에서도 TDD의 효과를 봐서 뿌듯하고 감사하다 :D
Written on April 10, 2018