[스프링 활용] 주문, 주문상품 엔티티 + 주문 리파지토리 개발

atdawn·2024년 6월 10일

SPRING BOOT+JPA

목록 보기
25/49

참고 : 인프런 [ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]


주문, 주문상품 엔티티

생성 메서드

Order의 경우 Order 뿐만 아니라 OrderItem, Delivery 등과 복잡한 연관관계를 가지고 있다. 그렇기 때문에 생성 메서드를 별도로 가지는 것이 좋다.

~domain/Order.java

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

기존의 방법인 new Order() 후 setter을 이용하여 값을 초기화하는 방식이 X

createOrder메서드가 연관관계를 고려하면서, 주문 상태, 시간 정보를 모두 세팅하게 된다.

  • 장점 : 생성지점 변경시 생성메서드만 변경하면 된다.

OrderItem 생성 메서드

//==생성 메서드==//
    public static OrderItem createOrderItem(Item item,int orderPrice,int count){
        OrderItem orderItem=new OrderItem(); //쿠폰이나 할인이 적용될 수 있기 때문에 item을 그대로 사용하지 않고 새로 new 해준다
        orderItem.setItem(item);
        orderItem.setOrderPrice(orderPrice);
        orderItem.setCount(count);

        item.removeStock(count);
        return orderItem;

    }
  • 쿠폰이나 할인이 적용될 수 있기 때문에 item을 그대로 사용하지 않고 새로 new 해준다.
  • 주문 아이템의 재고 수량을 감소시킨다.
    • Order의 생성메서드가 실행될때, OrderItem의 생성메서드가 그 전이 실행되어 , OrderItem의 재고수량을 먼저 감소시키고 넘어온다.

비즈니스 로직

~domain/Order.java

//==비즈니스 로직==//
    /**
     * 주문취소
     * */
    public void cancle(){
        if(delivery.getStaus()==DeliveryStatus.COMP){ //배송 완료 상태
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능 합니다.");
        }
        this.setStatus(OrderStatus.CANCLE);
        for(OrderItem orderItem : orderItems){ //한번 주문할때 고객이 상품 2개를 주문한다면 각각의 상품도 cancle상태로 변경
            orderItem.cancle();
        }
  • 주문이 완료된 상태는 취소 불가 (익셉션 발생)
  • 주문취소 상태로 변경
  • 한번 주문할때 고객이 상품 2개를 주문한다면 각각의 상품도 취소
    • OrderItem에 cancle메서드를 생성하여 Item의 재고수량을 증가시킨다.
     //== OrderItem 비즈니스 로직==//
     public void cancle() {
         getItem().addStock(count); //재고 수량 변경
     }

조회 로직

계산이 필요할 경우를 위해 조회 로직을 추가해주자.

~domain/Order.java

 //== 조회 로직 ==//
    /**
     * 전체 주문 가격 조회
     */
    public int getTotalPrice(){
        int totalprice=0;
        for(OrderItem orderItem:orderItems){
            totalprice+=orderItem.getTotalPrice(); //
        }
        return totalprice;
    }
  • 총주문가격 조회시 OrderItem의 개별 주문 가격*주문 수량 결과를 더해준다.
    • OrderItem에 getTotalPrice메서드를 생성하여 개별 상품의 주문 가격을 반환한다.
    //==OrderItem 조회 로직==//
     public int getTotalPrice() {
          return getOrderPrice()*getCount();
      }

주문 리파지토리

~repository/OrderRepository.java

@Repository
@RequiredArgsConstructor
public class OrderRepository {

    private final EntityManager em;

    public void save(Order order){
        em.persist(order);
    }

    public Order findOne(Long id){
        return em.find(Order.class,id);
    }

    //public List<Order> findAll(OrderSearch orderSearch) {}
}
  • findAll은 회원 검색 기능에 사용되는데, 추후 강의해주신다고 하심.
profile
복습 복습 복습

0개의 댓글