관심쟁이 영호

[#11.1] Spring Boot ㅣ 스프링 부트 ㅣ 주문 도메인 개발 본문

Bank-End/인프런- Spring 공부

[#11.1] Spring Boot ㅣ 스프링 부트 ㅣ 주문 도메인 개발

관심쟁이 영호 2021. 4. 15. 01:27
반응형

이번 시간에는 주문 도메인을 개발할거다.

개발자님께서 이 부분이 가장 중요하다고 하신다.

실제 비즈니스 로직들이 JPA로 어떻게 풀어나갈 수 있는지 볼 수 있다고 하신다.

 


1. 구현 기능

 - 상품 주문

 - 주문 내역 조회

 - 주문 취소

 

2. 구현 순서

 - 주문 엔티티, 주문상품 엔티티 개발

 - 주문 리포지토리 개발

 - 주문 서비스 개발

 - 주문 검색 기능 개발

 - 주문 기능 테스트

 

구현에 대한 기초 To Do List이다.

 

시작해보자.

 

3. 먼저 코드를 살펴보자.

// Order.class

@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")  // 매핑 - FK 지정
    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;

    private LocalDateTime orderDate; // 주문시간

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


    // == 연관관계 메서드 ==//

    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() == DeliveryState.COMP){ //COMP 는 이미 배송이 완료된 상품이다.
            throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
        }

        this.setStatus(OrderStatus.CANCEL);

        for(OrderItem orderItem: orderItems){
            //주문에 담은 각 상품들에 cancel을 날려주어 상품도메인에 각 상품에 갯수를 + 해주어야 한다.
            orderItem.cancel();
        }
    }


       // ==  조회 로직 == //


    /*
        전체 주문 가격 조회
     */
    public int getTotalPrice(){

        int totalPrice = 0;
        for (OrderItem orderItem: orderItems){
            totalPrice += orderItem.getTotalPrice();
        }
        return totalPrice;
    }

    

}

 

(1) 생성 매서드 추가

- 생성 매서드를 추가해준 이유는 Order 같은 경우에는 Member, Delivery, OrderItem과 같이 여러가지의 요소들이 복합적으로 있어서, 이것을 생성해주는 매서드를 따로 생성해주는 것이 좋다.

 

- 실무에 가면 훨씬 많은 요소들이 엉켜있어서 만들어 놓지 않으면 헷갈린다.

 

(2) 비즈니스 로직 추가

 

- Cancel() 매서드를 추가 해주었다. "주문 취소"의 경우에 해당하는 경우인데, 배송이 이미 완료된 상품이면 취소가 불가능하다.

 

- getTotalPrice() 매서드를 추가 했다. OrderItems에 들어있는 상품들 각각 수량과 가격을 계산해주어야 하기 때문에, OrderItem에도 조회 로직을 추가 해놓아야 한다.

 

 

본 강의는 인프런의 김영한 개발자님이 강의하고 계신

"실전! 스프링 부트와 JPA활용1 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.

300x250
Comments