관심쟁이 영호

[#18] Spring Boot ㅣ 완성된 코드 분석 ㅣ 주문하기 살펴보기! 본문

Bank-End/인프런- Spring 공부

[#18] Spring Boot ㅣ 완성된 코드 분석 ㅣ 주문하기 살펴보기!

관심쟁이 영호 2021. 5. 2. 01:08
반응형

이번에는 "주문하기"에 대한 코드를 살펴보자.

 

주문하기는 Member, item, order 등등 모든 테이블과 엔티티가 엮어있기 때문에 조금더 생각을 해야한다!

어쨋든, 홈화면에서 주문하기 버튼을 클릭해보자.

 

그렇게 되면,

localhost:8080/order로 넘어가게 된다.

화면은 아래와 같다.

여기서 Controller에 매핑이 되어있을 것이다.

해당 url이 매핑되어 있는곳으로 가보자!

 

※ 주문 회원, 상품명을 클릭하면 리스트가 콥보박스처럼 드롭다운된다. 

 

@Controller
@RequiredArgsConstructor
public class OrderController {
    private final OrderService orderService;
    private final MemberService memberService;
    private final ItemService itemService;
    
    @GetMapping(value = "/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";
    }
   
}

확실히 코드가 많다.

우리는 GetMapping을 했으니, @GetMapping부분을 살펴보자.

먼저 member와 item을 전부 찾아와서, List에 담아준다.

그리고 model에 담아준다음, orderForm.html을 불러준다.

이유는, 주문 페이지에서 등록된 상품들을 주문해야하니, item을 불러오고

member를 입력해주어야 하니 member를 다 불러오도록 만든 것이다.

 

그럼 여기서 model에 담아준 attribute들을 orderForm에서 어떻게 받는지 살펴보자.

 

orderForm.html을 보자.

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header" />
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <form role="form" action="/order" method="post">
        <div class="form-group">
            <label for="member">주문회원</label>
            <select name="memberId" id="member" class="form-control">
                <option value="">회원선택</option>
                <option th:each="member : ${members}"
                        th:value="${member.id}"
                        th:text="${member.name}" />
            </select>
        </div>
        <div class="form-group">
            <label for="item">상품명</label>
            <select name="itemId" id="item" class="form-control">
                <option value="">상품선택</option>
                <option th:each="item : ${items}"
                        th:value="${item.id}"
                        th:text="${item.name}" />
            </select>
        </div>
        <div class="form-group">
            <label for="count">주문수량</label>
            <input type="number" name="count" class="form-control" id="count"
                   placeholder="주문 수량을 입력하세요">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
    <br/>
    <div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>

html을 상세히모르지만 model을 넘겨주어서 orderForm을 생성하는 거 같다.

 

똑같이 form에 action과 method로 설정되어 있다. submit을 클릭하게 되면, 폼에 저장한다음,  "/order"로 post방식으로 정보를 넘겨주게 될 것이다.

그럼 그것을 받은 매핑으로 가보자.

 

 // OrderController.class
 
 @PostMapping(value = "/order")
    public String order(@RequestParam("memberId") Long memberId,
                        @RequestParam("itemId") Long itemId, @RequestParam("count") int count) {
        orderService.order(memberId, itemId, count);
        return "redirect:/orders";
    }
   

OrderController에 다음과 같이 매핑되어있다.

근데 여기서는 Form 객체로 받지않고, 각각에 key - value로 받고있다.

이것은 html문법인지 jpa 제공기능인지 정확하게는 모르겠다.

html 공부를 할 때, 찾아보자.

 

어쨋든 해당하는 데이터를 이용해서

orderService의 order 메서드를 실행해준다.

 

아래는 orderService이다.

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;
    private final MemberRepository memberRepository;
    private final ItemRepository itemRepository;
    //주문
    @Transactional
    public Long order(Long memberId, Long itemId, int count){

        //엔티티 조회
        Member member = memberRepository.findOne(memberId);
        Item item = itemRepository.findOne(itemId);

        //배송정보 생성
        Delivery delivery = new Delivery();
        delivery.setAddress(member.getAddress());

        //주문 상품 생성
        OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);

        //주문 생성
        Order order = Order.createOrder(member, delivery, orderItem);

        //주문 저장
        orderRepository.save(order);

        return order.getId();

    }
    
    }

 

OrderService에서 해당하는 엔티티를 찾아주고

금액 계산, 주문목록 생성 등등 로직을 거친 다음,

최종적으로 영속성 컨텍스트 저장을 위해서 넘겨준다.

 

이렇게 되면 orderRepository에서 save 메서드를 거치고 저장이 된다.

 

이 다음에는 주문 취소에 대해서 공부를 해보자!

 

300x250
Comments