스프링 부트와 JPA 활용1 - 주문 도메인 개발 1

JOY·2022년 4월 9일
0
post-thumbnail

📌 스프링 부트와 JPA 활용1 - 주문 도메인 개발 1

인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발


주문 도메인 개발 목차

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

2. 주문 리포지토리 개발

3. 주문 서비스 개발

4. 주문 기능 테스트

5. 주문 검색 기능 개발


구현 기능

  • 상품 주문
  • 주문 내역 조회
  • 주문 취소

1. 주문 엔티티 개발

1) 주문 엔티티 (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;
    }

    //==비즈니스 로직==//
    /**
     * 주문 취소
     */
    public void cancel(){
        //상태가 배송완료일 경우
        if (delivery.getStatus() == DeliveryStatus.COMP) {
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
        }

        this.setStatus(OrderStatus.CANCEL);
        for (OrderItem orderItem : orderItems) {
            orderItem.cancel();
        }
    }

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

    /*아래 코드처럼 사용 가능 java8*/
    /*
    public int getTotalPrice() {
        return orderItems.stream()
                .mapToInt(OrderItem::getTotalPrice)
                .sum();
    }
    */

📍 설명

1) 기능

  • createOrder() : 생성 메서드
    주문 엔티티 생성할 때 사용 한다.
    주문 회원, 배송 정보, 주문 상품의 정보를 받는다.
    생성 할 때 부터 createOrder()를 호출 해야 한다.
    member, delivery, orderItems 을 모두 불러와
    주문생성에 대한 복잡한 비즈니스 로직을 createOrder() 메서드 에서 한번에 처리

  • cancel() : 주문 취소 메서드
    주문 취소 시 사용 한다.
    비즈니스 로직에 대한 체크 로직이 엔티티 안에 입력 되어 있다.
    첫번째, 이미 배송이 완료된 주문은 취소하지 못한다.
    두번째, 주문 상태를 취소로 변경 후 orderItem에 대해 cancel()
    ※ 주문 시에는 removestock() 호출

    OrderItem.java

public void cancel() {
	//취소하면 재고 수량 원상 복귀 (증가)
    getItem().addStock(count);
  }
  • getTotalPrice() : 전체 주문 가격 조회 메서드
    주문한 item들의 전체 가격을 조회한다.
    전체 주문 가격 = 주문 가격 * 주문 수량

    OrderItem.java

public int getTotalPrice() {
        return getOrderPrice() * getCount();
    }

2. 주문 상품 엔티티 개발

2) 주문 상품 엔티티 (OrderItem.java)

기존 코드에 추가

💻 코드

	//==생성 메서드==//
    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 getOrderPrice() * getCount();
    }

📍 설명

1) 기능

  • OrderItem() : 생성 메서드
    주문 상품, 가격, 수량정보로 주문 상품 엔티티 생성
    주문이 생성되었으므로 removeStock() 메서드를 호출해 재고 감소
  • cancel() : 주문 취소 메서드
  • getTotalPrice() : 주문 상품 전체 가격 조회 메서드
profile
Just Do IT ------- 🏃‍♀️

0개의 댓글