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에 저장돼있어야할 엔티티가 없어서 오류가 나는 경우가 벌써 두번 있었는데, 코드가 늘어날수록 더 문제가 많아질 것 같다.

좋은 웹페이지 즐겨찾기