참고 : 인프런 [ 실전! 스프링 부트와 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";
}
...
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>
...

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

상품 취소 완료~!