(복습, 정리) 주문, 주문상품 엔티티 개발

애플리케이션에서 핵심 엔티티⭐️⭐️⭐️⭐️⭐️

  1. 각 필드(칼럼) 연관관계 매핑&옵션 설정 - XToOne : fetchType(LAZY) - cascadeType.ALL : Delivery(일대일, 라이프사이클 동일) List<OrderItem>(일대다, 라이프사이클 동일) =>주문과 배달은 일대일 매핑관계이다. 주문과 동시에 배달이 생겨나고, 생명주기 동일하다고 볼 수 있다. 그리고 Order 에서만 Delivery를 사용하기 때문에 Delivery에 cascadeType 옵션을 ALL로 해도된다. =>주문과 주문상품리스트는 일대다 매핑관계이다. 하나의 주문에는 여러개의 주문상품들이 있을 수 있다. 주문을 함으로써 주문상품들이 생겨나고, 주문을 취소하면 주문상품들도 함께 취소된다. 그리고 Order 에서만 OrderItem 리스트(컬렉션)을 사용하기 때문에 List<OrderItem> 또한 cascadeType 옵션을 ALL로 해도된다.

  2. 연관관계 편의 메서드 생성 Order에는 Member, OrderItem, Delivery가 있다. Order에 데이터가 수정되면 이와 연관된 Member, OrderItem, Delivery도 함께 수정해주어야한다! Member : setMember Order : addOrderItem Delivery : setDelivery

    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this);
    }
    
    public void addOrderItem(OrderItem orderItem) {
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }
    
    public void setDelivery(Delivery delivery) {
        this.delivery = delivery;
        delivery.setOrder(this);
    }
  3. 주문 생성 메서드 : createOrder(회원, 배달 정보, 주문 상품) 주문 하나를 생성하면 관련된 필드도 함께 생성되기 때문에 함께 셋팅하주어야하기 때문에 메서드를 통해 한번에 처하는 것이 객체 지향적(주문 이라는 객체를 생성함으로써 관련된 것들이 함께 생성되기 때문)이고, 응집력이 좋다! 외부에서 set하는 것이 아니라 생성메서드에서 한번에 처리한다!

    //생성하면서 연관관계가 얽힌 것들을 한번에 같이 해주기 때문에
    //주문 생성 후에 변경할 것이 있으면 createOrder만 변경해주면 된다!
    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;
    }
  4. 비즈니스 로직 주문 취소 : 현재 배송상태(DeliveryStatus)가 COMP이면 배송불가 익셉션 그렇지 않으면 주문 상태(OrderStatus)를 CANCEL로 변경. 주문을 취소하면 주문상품들(List<OrderItem>)도 취소해야한다. => 반복문으로 OrderItem 하나하나 다 취소처리(cancle메서드)한다.

    public void cancel(){
        //validation 로직
        if(delivery.getStatus() == DelieveryStatus.COMP){
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다");
        }
        //validation 통과 후 : 현재 주문 상태를 CANCEL로하고, 주문 상품도 원상 복구해준다!!
        this.setStatus(OrderStatus.CANCEL);
        for(OrderItem orderItem : orderItems){
            orderItem.cancle();//주문(상품 2개)일 때 상품 각각에 대해서도 취소처리해줘야함
        }
    }

    전체 가격 조회 : 현주 Order의 주문상품들(List<OrderItem>) 각각의 가격을 다 합산한다! =>OrderItem에 전체 가격 조회하는 메서드 추가 구현한다 : 가격*수량

    public int getTotalPrice(){
        int totalPrice = 0;
        for(OrderItem orderItem : orderItems){
            totalPrice += orderItem.getTotalPrice();//300*5 + 400*3 + ...
        }
        return totalPrice;
    }

    OrderItem의 전체 가격 메서드

    public int getTotalPrice(){//주문 가격 * 주문 수량
        return getOrderPrice() * getCount();
    }

Last updated