관심쟁이 영호
[#18] Spring Boot ㅣ 완성된 코드 분석 ㅣ 주문하기 살펴보기! 본문
이번에는 "주문하기"에 대한 코드를 살펴보자.
주문하기는 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 메서드를 거치고 저장이 된다.
이 다음에는 주문 취소에 대해서 공부를 해보자!
'Bank-End > 인프런- Spring 공부' 카테고리의 다른 글
[#19] Spring Boot ㅣ 완성 코드 분석 ㅣ 주문 취소 살펴보기 (0) | 2021.05.03 |
---|---|
[#17] Spring Boot ㅣ JPA로 테이블에 insert하기 ㅣ 완성 코드 분석하기 (0) | 2021.05.01 |
[#17] Spring Bootㅣ 코드 분해하기 ㅣ Entity클래스? JPA? (0) | 2021.04.30 |
[#16] Spring Boot ㅣ 완성한 프로젝트 기초부터 전부 뜯어보기 (0) | 2021.04.29 |
[Spring Boot 기초] user 테이블 생성하기. (0) | 2021.04.20 |