주문, 주문상품 엔티티 개발

트랜지션 주도 패턴, 도메인 주도 패턴?

구현 기능

  • 상품 주문

  • 주문 내역 조회

  • 주문 취소

구현 순서

  • 주문 엔티티, 주문상품 엔티티 개발(핵심 비즈니스 로직)

  • 주문 리포지토리 개발

  • 주문 서비스 개발

  • 주문 검색 기능 개발

  • 주문 기능 테스트

주문하면 단순 주문 목록에 데이터가 들어갈 뿐만 아니라 재고 목록에서 수량 줄어야 한다! 주문 취소하면 재고가 다시 증가되는 것도 마찬가지다.

Order

  1. 생성메서드 : 생성해야하는 필드(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

  1. 생성메서드 : 생성해야하는 필드(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