ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주문 도메인 개발 - 주문 로직 추가
    JPA/JPA 활용 2023. 7. 11. 18:10

    지금까지 한 것들은 전부 주문을 위한 개발이고, 비즈니스 로직들이 어떻게 JPA를 통해서 동작하는지 알 수 있기 때문에 주문 도메인 개발이 가장 중요한 도메인이다.

     

     

    주문 엔티티

    Order class

    // 생성 메서드 // 주문을 생성을 할 때부터 createOrder이 호출 됨
    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;
    }

    order 엔티티 아래에 생성 메서드를 추가해준다. 생성 메서드이기 때문에 order가 실행되면 바로 실행되는 메서드이다. order에 member와 delivery를 set으로 세팅해주고 orderitems는 for문을 통해 여러 item들을 addOrderItem으로 추가시켜준다.

     

     

    // 비즈니스 로직 //
    /**
     * 주문 취소
     */
    public void cancel() {
        if (delivery.getStatus() == DeliveryStatus.COMP) {
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
        }
    
        this.setStatus(OrderStatus.CANCEL); // 위의 예외가 안터지면 상태를 cancel로 바꿈
        for (OrderItem orderItem : orderItems) {
            orderItem.cancel();
        }
    }
    
    // 조회 로직 //
    /**
     * 전체 주문 가격 조회
     */
    public int getTotalPrice() {
        int totalPrice = 0;
        for(OrderItem orderItem : orderItems) {
            totalPrice += orderItem.getTotalPrice();
        }
        return totalPrice;
    }

    바로 아래에 주문 취소와 조회를 할 수 있는 비즈니스 로직을 만들어준다. 일단 취소는 cancel이 일어났을 때 이미 배송중이면 예외를 터트리고, 그렇지 않으면 order의 상태를 cancel로 변경 후 for문을 돌아가며 orderitem들을 cancel 시켜준다.

     

     

    OrderItem에 있는 cancel 함수

    // 비즈니스 로직
    public void cancel() {
        getItem().addStock(count); // 주문 당시 수량을 추가해줌
    }

     

     

    조회 로직에서는 totalPrice를 초기화 시켜주고 for문을 돌려가며 totalPrice에 getTotalPrice를 곱해준다.

     

     

    OrderItem에 있는 getTotalPrice 함수

    /**
     * 주문 상품 전체 가격 조회
     */
    public int getTotalPrice() {
        return getOrderPrice() * getCount();
    }

     

     

     

    주문 상품 엔티티

    OrderItem class

    OrderItem에서도 생성 메서드를 추가해줬다.

    //생성 메서드 //
    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;
    }

    order로 가기전에 removeStock(count)를 통해 주문을 하면 count만큼 stock이 줄어드는 기능을 만들었다. 이후에 order에서 cancel이 일어나면 아래에 있는 cancel 함수로 다시 수량이 돌아오는 것이다.

     

Designed by Tistory.