OrderController 구현
OrderController 구현
목표
- 기존 OrderForm 에 카테고리 선택창을 포함시킨다
- 카테고리 선택에 따라서 그에 맞는 아이템 목록을 보여준다.
과정
- ItemRepository 에 findByCategory method 생성
public List<Item> findByCategory(Category category){
return em.createQuery("select i from Item i where i.category =: category")
.setParameter("category",category)
.getResultList();
}
- thymleaf, html 수정
<form role="form" action = "/order/byCategory" method="get">
<div class="form-group">
<label for="category">카테고리</label>
<button type="submit">카테고리 검색</button>
<select name="categoryId" id="category" class="form-control">
<option value="">카테고리선택</option>
<option th:each="category : ${categories}"
th:value="${category.id}"
th:text="${category.name}" />
</select>
</div>
</form>
html에 대한 지식이 거의 0에 수렴하는 상태라 html 수정에 가장 애를 먹는 중이다.
form
,div
로 구역이 구분돼있고, form 태크에 해당 form 에서 어떤 기능을 수행하는지를 정의한다.
action은 호출할 url, method는 호출 방식
그리고 button type으로 버튼을 눌렀을 때 무엇을 수행할지 정의하는데 , summit으로 데이터를 서버에 전송한다.
model-categories에 category list를 담아서 templete engine에 전달한다.
@GetMapping("/order/byCategory")
public String orderFormCategoery(Model model,@RequestParam("categoryId") Long categoryId){
Category category = categoryRepository.findOne(categoryId);
List<Item> byCategory = itemService.findByCategory(category);
List<Member> members = memberService.getMemberList();
model.addAttribute("items", byCategory);
model.addAttribute("members",members);
model.addAttribute("categories", category);
return "orders/orderForm";
}
카테고리 검색 버튼을 눌렀을 때 해당 컨트롤러로 이동해서 로직을 수행하는데, itemService의 findByCategory로 처음과 달리 카테고리에 맞는 아이템들만 찾아서 뷰에 반환한다.
부족한 점
- 카테고리를 선택만 해도 아이템 리스트가 최신화 되게 하고싶은데, 프론트를 좀 더 알아야 가능할 것 같다.
- 카테고리 검색을 하면 아이템을 제외하고도 Member 등을 다시 찾아서 model에 입력해줬는데, 아이템만 빼서 최신화해야 효율적일 것이다.
OrderList
@PostMapping("/order")
public String createOrder(@RequestParam("memberId") Long memberId,
@RequestParam("itemId") Long itemId,
@RequestParam("count") int count){
Order order = new Order();
OrderItem orderItem = new OrderItem();
order.setMember(memberService.findOne(memberId));
Item item = itemService.findOne(itemId);
orderItem.setItem(item);
orderService.createOrder(order);
orderItem.setOrder(order);
orderItem.setCount(count);
try{
item.removeStockQuantity(count);
} catch (NotEnoughException e){
return "orders/orderForm";
}
orderRepository.saveOrderItem(orderItem);
return "home";
}
-
설명
orderForm 에서 Post로 memberId, itemId, count 에 대한 데이터를 보내준다.
-
@RequestParam("name") Type name
요청 파라미터를 받는 방법 중 @RequestParam 어노테이션을 이용했다.
각각의 id값을 받아서 해당 Service에서 조회하는 식으로 데이터를 order entity 에 입력하고 , 저장했다.*#### try catch , NotEnoughException
예외처리다.NotEnoughException 이라는 예외를 따로 클래스를 생성해 만들었는데, 이렇게 했을 때 장점은 예외 사유가 명확해진다는 점이다. 개발 과정에서 여러곳에서 비슷한 예외가 발생한다면 이렇게 명확하게 하는 것이 개발에 도움이 된다.
public class NotEnoughException extends RuntimeException{
public NotEnoughException() {
super();
}
public NotEnoughException(String message) {
super(message);
}
public NotEnoughException(String message, Throwable cause) {
super(message, cause);
}
public NotEnoughException(Throwable cause) {
super(cause);
}
protected NotEnoughException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
RuntimeException을 상속받았다.
removeStockQuantity
주문한 count 만큼 stockQuantity 를 감소시키는 메소드를 item 엔티티에 생성했다.
이렇게 item 에 있는 데이터를 다루는 함수를 도메인 자체에 포함시켜 개발하는 개발방식을 도메인주도설계(DDD)라 하는데, 설계방식마다 장단점이 있다고 한다.
부족한 점
order, orderItem 을 생성하고 값을 셋팅하는 코드를 좀 간략화 할 필요가 있고, 그 순서에 대한 체계를 갖춰야 한다.
먼저 DB에 저장돼있어야할 엔티티가 없어서 오류가 나는 경우가 벌써 두번 있었는데, 코드가 늘어날수록 더 문제가 많아질 것 같다.
Author And Source
이 문제에 관하여(OrderController 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bins1225/21.10.22저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)