실전! 스프링 부트와 JPA 활용1(웹 애플리케이션 개발)

Ch06. 주문 도메인 개발 - 주문, 주문상품 엔티티 개발

webmaster 2021. 12. 6. 10:43
728x90

주문 엔티티, 비즈니스 로직 개발

@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;//연관관계의 주인

    @OneToMany(mappedBy = "order",cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;//외래키를 아무대나 넣어줘도 되지만, 자주 참조될거같은 Order 에 두는게 편하다
    //hibernate 가 알아서 시간타입을 메핑 해준다.
    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;//주문상태 [ ORDER,CANCLE]

    //==연관관계 메소드==//
    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);
    }

    //==생성 메소드 ==//
    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();//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;
    }

    //==조회 로직==/
    /**
     * 전체 상품 주문 조회
     */
    public int getTotalPrice(){
        int totalPrice = 0;
        for(OrderItem orderItem : orderItems){
            totalPrice += orderItem.getTotalPrice();
        }
        return totalPrice;
    }

}
  • createOrder 메서드 
    • 생성 메소드를 만들어 Order를 생성하기 위해 연관된 것들을 다 세팅해 준다.
    • 후에 생성로직이 변경되어도 이 메서드만 변경하면 된다.
    • 주문 상태를 ORDER로 생성한뒤, 주문시간을 현재 시간으로 세팅한다.
  • cancel 메소드
    • 주문 취소 메서드
    • 배송 완료된 건에 대해서는 에러를 발생시킨다.
    • 주문이 취소될 경우 주문 상태를 CANCEL로 변경시킨 뒤, orderItem에 Cancel 메서드를 실행시킨다.
      • OrderItem의 Cancel 메소드
        • 재고 수량을 원복 해준다.
  • getTotalPrice 메서드
    • 총가격의 더해준다.
    • orderItem의 getTotalPrice 메서드를 호출하여 총 가격의 값에 더해준다. 
      • OrderItem의 getTotalPrice 메소드
        • 재고 * 가격을 값을 더해준다.

주문 상품 엔티티, 비즈니스 로직 개발

@Entity
@Getter
@Setter
public class OrderItem {
    @Id
    @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;
    
    private int orderPrice;//주문 가격
    private int 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;
    }

    //==비지니스 로직==//
    public void cancel() {
        getItem().addStock(count);//재고수량을 원복해준다
    }

    public int getTotalPrice() {
        return orderPrice * count;
    }

}
  • createOrderItem 메서드 
    • 생성 메서드를 만들어 OrderItem를 생성하기 위해 연관된 것들을 다 세팅해 준다.
    • 후에 생성 로직이 변경되어도 이 메서드만 변경하면 된다.
    • 재고의 개수를 감소시킨다.
  • cancel 메서드
    • 재고 수량을 원복 해준다.
  • getTotalPrice 메서드
    • 총가격의 더해준다.
    • orderItem의 getTotalPrice 메서드를 호출하여 총 가격의 값에 더해준다. 
      • OrderItem의 getTotalPrice 메소드
        • 재고 * 가격을 값을 더해준다.
728x90