order 기능 개선

bin1225·2021년 12월 21일
0

기존 문제점

- 주문을 해도 orderItem이 cart에 남아있었다.
- 완료된 주문을 확인할 수 있는 방법이 없었다.
- 완료된 주문에 대한 정보를 유지하지 않았다.

orderController

@PostMapping("/order")
    public String order(@ModelAttribute Order order, HttpServletRequest request) {
        List<Long> ids = order.getIds();
        List<OrderItem> orderItems = order.getOrderItems();
        for (int i = 0; i < ids.size(); i++) {
            OrderItem orderItem = orderRepository.findOrderItem(ids.get(i));

            orderItem.setOrder(order);
            orderItem.setOrdered(true);
            orderItems.add(orderItem);
        }


        Cookie[] cookies = request.getCookies();
        Cookie c = cookies[0];
        Long userId = Long.valueOf(c.getValue());
        Member member = memberService.findOne(userId);

        order.setMember(member);
        orderRepository.regist(order);

        return "redirect:/main";
    }

주문시 orderItem을 삭제해버렸을 때 문제점은 주문한 데이터 자체가 사라져버린다는 점이었다. 따라서 boolean타입의 ordered 속성을 만들어서 값을 true 로 설정함으로써 cart를 호출하는 controller에서 필터링 할 수 있도록 하였다.

for(int i = 0 ; i< orderItems.size();i++){
      if(!orderItems.get(i).isOrdered())
      {
          ois.add(orderItems.get(i));
     }
} 

아직 jpa 데이터 구조에 익숙하지 않아서 orderItem과 order의 연관관계에 대한 이해가 부족해 어려움을 겪었다.
pk값을 가진 orderItem의 order객체에 값을 주입했어야 했는데, 반대로 order 객체에 orderItem만 저장해서 계속 orderItem을 view에 반환하려고 해도 db에 저장된 값이 없어서 오류가 났었다.

view

admin/orderList

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>
<div class="container">
    <div th:replace="admin/fragments/bodyHeader :: bodyHeader" />
    <div>

        <table class="table table-striped">
            <thead>
            <tr>
                <th>주문번호</th>
                <th>회원명</th>
                <th>대표상품 이름</th>
                <th>대표상품 주문가격</th>
                <th>대표상품 주문수량</th>

                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="order : ${orders}">
                <td th:text="${order.id}"></td>
                <td th:text="${order.member.name}"></td>
                <td th:text="${order.orderItems.get(0).item.name}"></td>
                <td th:text="${order.orderItems.get(0).orderPrice}"></td>
                <td th:text="${order.orderItems.get(0).count}"></td>
                <td>
                    <a href="#" th:href="@{/orders/{id} (id=${order.id})}"
                       class="btn btn-primary" role="button">주문 상세</a>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
    <div th:replace="fragments/footer :: footer"/></div>
</body>
</html>

admin/orderDetail

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header" />
<body>
<div class="container">
    <div th:replace="admin/fragments/bodyHeader :: bodyHeader" />
    <div>
        <table class="table table-striped">
            <thead>
            <tr>
                <th>category</th>
                <th>상품명</th>
                <th>상품 가격</th>
                <th>수량</th>
                <th>주문 가격</th>
                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="orderItem : ${orderItems}">
                <td th:text="${orderItem.item.category}"></td>
                <td th:text="${orderItem.item.name}"></td>
                <td th:text="${orderItem.item.price}"></td>
                <td th:text="${orderItem.count}"></td>
                <td th:text="${orderItem.orderPrice}"></td>
            </tr>
            </tbody>
        </table>
    </div>
    <div th:replace="fragments/footer :: footer"/>
</div> <!-- /container -->
</body>
</html>

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN