인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
기존 코드에 추가
//==생성 메서드==//
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for(OrderItem orderItem : orderItems){
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
//==비즈니스 로직==//
/**
* 주문 취소
*/
public void cancel(){
//상태가 배송완료일 경우
if (delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}
//==조회 로직==//
/**
* 전체 주문 가격 조회
*/
public int getTotalPrice() {
int totalPrice = 0;
for (OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
/*아래 코드처럼 사용 가능 java8*/
/*
public int getTotalPrice() {
return orderItems.stream()
.mapToInt(OrderItem::getTotalPrice)
.sum();
}
*/
1) 기능
createOrder() : 생성 메서드
주문 엔티티 생성할 때 사용 한다.
주문 회원, 배송 정보, 주문 상품의 정보를 받는다.
생성 할 때 부터 createOrder()
를 호출 해야 한다.
member, delivery, orderItems 을 모두 불러와
주문생성에 대한 복잡한 비즈니스 로직을 createOrder() 메서드 에서 한번에 처리
cancel() : 주문 취소 메서드
주문 취소 시 사용 한다.
비즈니스 로직에 대한 체크 로직이 엔티티 안에 입력 되어 있다.
첫번째, 이미 배송이 완료된 주문은 취소하지 못한다.
두번째, 주문 상태를 취소로 변경 후 orderItem에 대해 cancel()
※ 주문 시에는 removestock()
호출
OrderItem.java
public void cancel() {
//취소하면 재고 수량 원상 복귀 (증가)
getItem().addStock(count);
}
getTotalPrice() : 전체 주문 가격 조회 메서드
주문한 item들의 전체 가격을 조회한다.
전체 주문 가격 = 주문 가격 * 주문 수량
OrderItem.java
public int getTotalPrice() {
return getOrderPrice() * getCount();
}
기존 코드에 추가
//==생성 메서드==//
public static OrderItem createOrderItem(Item item, int orderPrice, int count){
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
//주문 수량 만큼 재고 감소
item.removeStock(count);
return orderItem;
}
//==비즈니스 로직==//
public void cancel() {
//취소하면 재고 수량 원상 복귀 (증가)
getItem().addStock(count);
}
//==조회 로직==//
/**
* 주문상품 전체 가격 조회
*/
public int getTotalPrice() {
return getOrderPrice() * getCount();
}
1) 기능
removeStock()
메서드를 호출해 재고 감소