# 상품 주문

구현할 내용

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

   ```java
   @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 속성값으로 데이터 조회 가능**하다!!!

   ```java
   @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. 타임리프 템플릿

![](https://1491120136-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeIsSQVBsQu8Hb7mOOk%2F-MeSMr0kpI9k_kiGq1is%2F-MeSNxoScYCaHq0HwRZI%2F%E1%84%89%E1%85%A1%E1%86%BC%E1%84%91%E1%85%AE%E1%86%B7%20%E1%84%8C%E1%85%AE%E1%84%86%E1%85%AE%E1%86%AB_%E1%84%83%E1%85%A9%E1%86%BC%E1%84%8C%E1%85%A5%E1%86%A8%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3%20%E1%84%92%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%90%E1%85%B3!!!.png?alt=media\&token=7ac34768-b27f-4171-aa88-1fc2ce0e82a0)

<기술 설명>

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

![OrderController에서 주문하는 메서드](https://1491120136-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeIsSQVBsQu8Hb7mOOk%2F-MeSO-qMBZkyvVCQe0JD%2F-MeSOdzTYkZ4MeH9cqHq%2FOrdeerController%E1%84%8B%E1%85%A6%E1%84%89%E1%85%A5%20%E1%84%8C%E1%85%AE%E1%84%86%E1%85%AE%E1%86%AB%20%E1%84%89%E1%85%A2%E1%86%BC%E1%84%89%E1%85%A5%E1%86%BC.png?alt=media\&token=421e9376-994c-4270-852e-e1691cdd327d)

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

![](https://1491120136-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeIsSQVBsQu8Hb7mOOk%2F-MeSOmr-SjnXtFqk8jrC%2F-MeSOpAxGadDG-1KrNJx%2FOrderService%E1%84%8B%E1%85%B4%20order%20%E1%84%92%E1%85%A1%E1%86%B7%E1%84%89%E1%85%AE.png?alt=media\&token=7f7a80e4-8d48-4f96-b95a-9b8c2ad44ffc)

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

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

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