주문, 주문상품 엔티티 개발
트랜지션 주도 패턴, 도메인 주도 패턴?
구현 기능
상품 주문
주문 내역 조회
주문 취소
구현 순서
주문 엔티티, 주문상품 엔티티 개발(핵심 비즈니스 로직)
주문 리포지토리 개발
주문 서비스 개발
주문 검색 기능 개발
주문 기능 테스트
주문하면 단순 주문 목록에 데이터가 들어갈 뿐만 아니라 재고 목록에서 수량 줄어야 한다! 주문 취소하면 재고가 다시 증가되는 것도 마찬가지다.
Order
생성메서드 : 생성해야하는 필드(Member, Delivery, OrderItem, LocalDateTime, OrderStatus)가 많을 땐 생성 메서드를 따로 구현한다! OrderStatus : 주문이 생성되면 ORDER로 해준다. OrderDate : LocalDateTime.now()
public static Order createOrder(Member member,Delivery delivery,OrderItem... orderItems){//orderItem에서 이미 수량 감산하고 넘어온다.
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;
}
2. 비즈니스 로직 : 주문 취소 배송이 완료되면 주문 취소가 불가능하다. 1. validation 로직 : delivery.getStatus() == DeliveryStatus.COMP
Order 내부에 있는 Delivery 엔티티의 상태 조회하고, 이미 배송완료된 상태라면 Exception 2. validation 통과 후 - 주문 상태 CANCEL로 처리 - 주문 상품도 cancle() 처리 : 주문(상품 2개)일 때 상품 각각에 대해서도 취소 처리해줘야함! (OrderItem에서 cancle 메서드 구현 필요)
public void cancel(){
//validation
if(delivery.getStatus() == DelieveryStatus.COMP){
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다");
}
//validation 통과 후
this.setStatus(OrderStatus.CANCEL);
for(OrderItem orderItem : orderItems){
orderItem.cancle();
}
}
3. 조회 로직 : 전체 주문 가격 조회 현재 Order에 있는 OrderItem 리스트인 orderItems를 반복문으로 돌면서 각 상품 수량과 가격을 곱한 값을 다 더해준다! (OrderItem에서 상품 수량과 가격을 곱해서 총가격 구하는 메서드 구현 필요)
public int getTotalPrice(){
int totalPrice = 0;
for(OrderItem orderItem : orderItems){
totalPrice += orderItem.getTotalPrice();//300*5 + 400*3 + ...
}
return totalPrice;
}
Java8 버전 문법 : stream을 mapToInt로 변환
public int getTotalPrice(){//stream을 mapToInt로 변환
return orderItems.stream()
.mapToInt(OrderItem::getTotalPrice)
.sum();
OrderItem
생성메서드 : 생성해야하는 필드(Item, Order, orderPrice, count)가 많을 땐 생성 메서드를 따로 구현한다!
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;
}
2. 비즈니스 로직
public void cancle(){
getItem().addStock(count);//재고 수량 증가.아이템을 가져와서(getItem()) 주문 수량만큼 다시 늘려줘야한다!
}
3. 조회 로직 : 주문 상품 전체 가격 조회
public int getTotalPrice(){//주문 가격 * 주문 수량
return getOrderPrice() * getCount();
}
Last updated
Was this helpful?