@RequestMapping(value = "confirm")
  public String confirm(Model model, Cart cart, @Valid Shipping shipping, Errors errors) {

    // if cart is empty, redirect to cart view page.
    if (cart.getReadOnlyItemList().size() < 1) {
      return "redirect:/cart/view";
    }

    // validation
    if (errors.hasErrors()) {
      logger.debug(errors);
      return "redirect:shipping?redirected=true";
    }

    model.addAttribute("cart", cart);
    model.addAttribute("shipping", shipping);
    return "checkout/confirm";
  }
  @RequestMapping(value = "complete")
  public String complete(Shipping shipping, Cart cart, HttpSession httpSession) throws Exception {

    // check transaction token
    boolean checkResult =
        TransactionTokenHelper.checkToken(httpSession, shipping.getTransactionToken());
    if (!checkResult) {
      throw new Exception("Transaction Token Unmatch !");
    }

    boolean result = purchaseService.execPurchase(cart, shipping);
    if (result) {
      TransactionTokenHelper.removeToken(httpSession);
      cart.removeAll();
      logger.debug("### purchase succeed!!");
    }

    return "redirect:thankyou";
  }