[스프링 활용] 상품 주문, 주문 목록, 취소

atdawn·2024년 6월 24일

SPRING BOOT+JPA

목록 보기
34/49

참고 : 인프런 [ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]


상품 주문

OrderController

 @GetMapping("/order")
    public String createForm(Model model) {
        List<Member> members=memberService.findMembers();
        List<Item> items=itemService.findItems();

        model.addAttribute("members", members);
        model.addAttribute("items", items);

        return "order/orderForm";
    }

    @PostMapping("/order")
    public String order(@RequestParam("memberId") Long memberId,
                        @RequestParam("itemId") Long itemId,
                        @RequestParam("count") int count ){
        orderService.order(memberId, itemId, count);
        return "redirect:/orders";
    }

@RequestParam

  • 스프링 어노테이션
  • HTTP 요청 파라미터를 메서드의 파라미터로 바인딩할 때 사용
  • 로 GET 요청의 쿼리 파라미터나 POST 요청의 폼 데이터를 처리하는 데 사용

주요 속성

  • value 또는 name: HTTP 요청 파라미터의 이름을 지정. 기본값은 파라미터 이름과 동일한 메서드 파라미터 이름.
    required: 해당 파라미터가 필수인지 여부를 지정. 기본값은 true. 필수 파라미터가 요청에 없으면 예외가 발생.
    defaultValue: 요청 파라미터가 없을 때 사용할 기본값을 지정. 기본값이 지정된 경우, required는 자동으로 false.

orderForm.html

...
  <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <form role="form" action="/order" method="post">
        <div class="form-group">
            <label for="member">주문회원</label>
            <select name="memberId" id="member" class="form-control">
                <option value="">회원선택</option>
                <option th:each="member : ${members}"
                        th:value="${member.id}"
                        th:text="${member.name}"/>
            </select>
        </div>
      ...
  • <label for="member">주문회원</label>: 셀렉트 박스의 라벨. for="member"는 연결된 셀렉트 박스의 id와 일치해야 함.
  • <select name="memberId" id="member" class="form-control">: 드롭다운 리스트를 정의
    • name="memberId": 폼 제출 시 이 드롭다운 리스트의 선택된 값이 memberId라는 이름으로 서버에 전달
    • id="member": 셀렉트 박스의 고유 식별자
  • <option value="">회원선택</option>: 기본 옵션으로, 선택된 회원이 없을 때 표시. 값은 빈 문자열
  • <option th:each="member : ${members}" th:value="${member.id}" th:text="${member.name}"/>
    • th:each="member : ${members}": Thymeleaf의 th:each 속성을 사용하여 서버에서 전달된 members 리스트를 반복. members는 서버에서 제공한 회원들의 리스트.
    • th:value="${member.id}": 각 member 객체의 id 값을 옵션의 값으로 설정
    • th:text="${member.name}": 각 member 객체의 name 값을 옵션의 텍스트로 설정

    상품 주문까지 완료!

상품 목록

OrderController

...
 @GetMapping("/orders")
    public String orderList(@ModelAttribute("orderSearch")OrderSearch orderSearch,Model model){
        List<Order> orders = orderService.findOrders(orderSearch);
        model.addAttribute("orders", orders);
        return "order/orderList";
    }
    ...
  • @ModelAttribute("orderSearch")OrderSearch orderSearch를 파라미터로 넣게되면, model에 직접 Attribute 하지 않아도, 암묵적으로 model.addAttribute("orders", orders); 기능을 수행하여 모델에 객체를 추가한다.

orderList.html

...
   <select th:field="*{orderStatus}" class="form-control">
                        <option value="">주문상태</option>
                        <option th:each=
                                        "status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
                                th:value="${status}"
                                th:text="${status}">option
                        </option>
                    </select>
...
 <table class="table table-striped">
            <thead>
            <tr>
              ...
            </tr>
            </thead>
            <tbody>
            <tr th:each="item : ${orders}">
                <td th:text="${item.id}"></td>
                <td th:text="${item.member.name}"></td>
                <td th:text="${item.orderItems[0].item.name}"></td>
                <td th:text="${item.orderItems[0].orderPrice}"></td>
                <td th:text="${item.orderItems[0].count}"></td>
                <td th:text="${item.status}"></td>
                <td th:text="${item.orderDate}"></td>
                <td>
                    <a th:if="${item.status.name() == 'ORDER'}" href="#"
                       th:href="'javascript:cancel('+${item.id}+')'"
                       class="btn btn-danger">CANCEL</a>
                </td>
            </tr>
            </tbody>
        </table>
...
<script>
    function cancel(id) {
        var form = document.createElement("form");
        form.setAttribute("method", "post");
        form.setAttribute("action", "/orders/" + id + "/cancel");
        document.body.appendChild(form);
        form.submit();
    } </script>
...
  • OrderStatus 에서 Enum값을 가져와서 셀렉트 목록으로 보여줌
  • Status값이 ORDER일때만 캔슬 버튼이 보이도록함.
  • 캔슬 버튼 클릭시 form과 함께 post로 넘김


주문 취소

OrderController

...
 @PostMapping("/orders/{orderId}/cancel")
    public String cancelOrder(@PathVariable("orderId") Long orderId){
        orderService.cancelOrder(orderId);
        return "redirect:/orders";
    }
    ...


상품 취소 완료~!

profile
복습 복습 복습

0개의 댓글