실전! 스프링 부트와 JPA 활용1(웹 애플리케이션 개발)

Ch07. 웹 계층 개발 - 상품 주문

webmaster 2021. 12. 7. 17:31
728x90
@Controller
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;

    private final MemberService memberService;

    private final ItemService itemService;

    @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){
        //핵심 비지니스 로직이 있는경우 식별자만 넘겨주고 서비스에서 모두 적용시켜주는 것이 좋다.
        //하나의 영속성 컨택스트에서 동작시키기 위해 식별자를 받아 Transaction 에서 동작시킨다.
        orderService.order(memberId,itemId,count);
        return "redirect/order";
    }
}
  • createForm 메서드
    • 주문을 등록하는 화면을 보여주는 메서드
    • Member 목록과 item목록을 읽어 들여 SelectBox에 뿌려준다.
  • order 메서드
    • 여러 식별자를 조회해주는 경우 하나의 서비스 메서드에서 동작시켜 주는 것이 좋다.
      • why? 영속성 컨택스트로 관리해 줄수 있기 때문에.
      • 만약 controller에서 조회하여 service에서 객체를 전달받을 경우 해당 객체는 영속성 컨택스트가 관리하는 것이 아닌 준영속 컨택스트가 되는 것이므로 더티 체크와 같은 기능을 동작시켜 줄 수가 없다.
      • 따라서 하나의 트랜잭션에서 메서드를 동작시켜 줄 수 있도록 하는 것이 좋다.

 

728x90