참고 : 인프런 [ 실전! 스프링 부트와 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메서드가 연관관계를 고려하면서, 주문 상태, 시간 정보를 모두 세팅하게 된다.
//==생성 메서드==//
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;
}
~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();
}
//== 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 조회 로직==//
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) {}
}