-
주문 도메인 개발 - 주문 로직 추가JPA/JPA 활용 2023. 7. 11. 18:10
지금까지 한 것들은 전부 주문을 위한 개발이고, 비즈니스 로직들이 어떻게 JPA를 통해서 동작하는지 알 수 있기 때문에 주문 도메인 개발이 가장 중요한 도메인이다.
주문 엔티티
Order class
// 생성 메서드 // 주문을 생성을 할 때부터 createOrder이 호출 됨 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; }
order 엔티티 아래에 생성 메서드를 추가해준다. 생성 메서드이기 때문에 order가 실행되면 바로 실행되는 메서드이다. order에 member와 delivery를 set으로 세팅해주고 orderitems는 for문을 통해 여러 item들을 addOrderItem으로 추가시켜준다.
// 비즈니스 로직 // /** * 주문 취소 */ public void cancel() { if (delivery.getStatus() == DeliveryStatus.COMP) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCEL); // 위의 예외가 안터지면 상태를 cancel로 바꿈 for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } // 조회 로직 // /** * 전체 주문 가격 조회 */ public int getTotalPrice() { int totalPrice = 0; for(OrderItem orderItem : orderItems) { totalPrice += orderItem.getTotalPrice(); } return totalPrice; }
바로 아래에 주문 취소와 조회를 할 수 있는 비즈니스 로직을 만들어준다. 일단 취소는 cancel이 일어났을 때 이미 배송중이면 예외를 터트리고, 그렇지 않으면 order의 상태를 cancel로 변경 후 for문을 돌아가며 orderitem들을 cancel 시켜준다.
OrderItem에 있는 cancel 함수
// 비즈니스 로직 public void cancel() { getItem().addStock(count); // 주문 당시 수량을 추가해줌 }
조회 로직에서는 totalPrice를 초기화 시켜주고 for문을 돌려가며 totalPrice에 getTotalPrice를 곱해준다.
OrderItem에 있는 getTotalPrice 함수
/** * 주문 상품 전체 가격 조회 */ public int getTotalPrice() { return getOrderPrice() * getCount(); }
주문 상품 엔티티
OrderItem class
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; }
order로 가기전에 removeStock(count)를 통해 주문을 하면 count만큼 stock이 줄어드는 기능을 만들었다. 이후에 order에서 cancel이 일어나면 아래에 있는 cancel 함수로 다시 수량이 돌아오는 것이다.
'JPA > JPA 활용' 카테고리의 다른 글
주문 기능 테스트 (0) 2023.07.11 주문 리포지토리, 서비스 개발 (0) 2023.07.11 상품 리포지토리, 서비스 개발 (0) 2023.07.11 상품 엔티티 개발(비즈니스 로직) (0) 2023.07.11 회원 가입, 조회 기능 테스트 (0) 2023.07.11