상품 주문

구현할 내용

  1. 컨트롤러 : OrderController 클래스 아이템과 회원이 함께 필요하기 때문에 dependency가 여럿 존재! ① GetMapping : 주문 작성 폼 페이지 조회

    @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 : PostMapping PRG(POST, Redirect, GET) 기억하자! @RequestParam으로 전송받은 HTML Form 데이터로 주문 생성한다!!!

    @RequestParam으로 전송받은 HTML Form 데이터에서 타임리프 html에서 <select>태그의 name 속성값으로 데이터 조회 가능하다!!!

    @PostMapping("/order")
    public String order(@RequestParam("memberId") Long memberId,
                        @RequestParam("itemId") Long itemId,
                        @RequestParam("count") int count){
      orderService.order(memberId,itemId,count);//상품 여러개를 선택할 땐 이부분 고쳐주면 됨.
    //Long orderId = orderService.order(memberId, itemId, count);//상품 여러개를 선택할 땐 이부분 고쳐주면 됨.
      return "redirect/orders";
    //return "redirect/orders"+orderId;//주문된 결과 페이지로 리다이렉트
    }
  2. 타임리프 템플릿

<기술 설명>

OrderController에서 주문하는 메서드 단순히 식별자(그리고 수량)를 넘겨준다!

OrderService에서 주문을 생성하는 @Transactional order 메서드

컨트롤러 내에서 엔티티를 찾아서 넘길 수도 있지만 이보다는 엔티티의 트랜잭션 내에서 조회하는 것이 코드도 깔끔하고, 트랜잭션내에서 엔티티로 할 수 있는 것들이 더 많아진다!

주로 주문 같은 커맨드성은 외부에서 식별자만 넘기고, 핵심 비즈니스인 서비스(데이터 수정이 빈번하게 일어날 수 있는 곳)에서 엔티티를 조회하는 것부터 한다!!그러면 트랜잭션 내에서 엔티티가 영속상태를 유지할 수 있다! 주문할 때 아이템이나 멤버 같은 것들이 바뀔 때 Order 엔티티의 트랜잭션 내에서 수정이 일어나게 됨. 덜티 체킹(변경 감지) 일어남.

그런데 밖에서 엔티티를 넘겨주게되면 이러한 것들이 적용되지 않는다. 왜냐하면 트랜잭션 없이 외부에서 조회한 것이므로 JPA가 관리하는 영속성 컨텍스트가 아니기 때문이다!⭐️⭐️⭐️⭐️⭐️

Last updated