실습하면서 생긴 오류
→ 오류를 읽어보았는데 member라는 class가 2개 이상 존재하여서 발생되는 문제라고 하였다. 그래서 사용하지않는 member class를 제거하고 domain.item package에 있는 member class만 남겼더니 해결되었다.
구현 기능 1.상품 주문 2.주문 내역 조회 3.주문 취소 cancel
1.주문 엔티티, 주문상품 엔티티 개발
Order class (jpabook.jpashop.domain.item)
//==생성 메서드==//createOrder매서드
public staticOrder createOrder(Member member, Delivery delivery,
OrderItem... orderItems) { //멤버 배송정보 주문아이템들
매개변수로 하기(...은 여러개 넘길 수 있다)
Order order =new Order(); //Order생성
order.setMember(member);
order.setDelivery(delivery);
for(OrderItem orderItem : orderItems) { //for문 사용해서
order.addOrderItem(orderItem); //orderItem 넣어준다
}
order.setStatus(OrderStatus.ORDER); //orderStatus 처음상태를 ORDER로 해주기
order.setOrderDate(LocalDateTime.now()); //주문시간정보를 현재시간으로 잡기
return order;
}
Order class (jpabook.jpashop.domain.item)
//==비즈니스 로직==//
/**주문 취소*/
public void cancel() {
if(delivery.getStatus() == DeliveryStatus.COMP) { //delivery상태가 이미 배송완료되면
throw newIllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}//(validation logic 사용)
//그 이외의 경우는!
this.setStatus(OrderStatus.CANCEL); //order상태를 cancel로
for(OrderItem orderItem :orderItems) { //for문 사용해서
orderItem.cancel();//orderItem에도 다 cancel 넣어주도록 해준다
}
}
OrderItem class로 가서
//==비즈니스 로직==//
/** 주문 취소 */
public void cancel() {
getItem().addStock(count); // 주문수량만큼 재고수량을 늘려주는게 중요
}
다시 Order class에서
//==조회 로직==//
/**전체 주문 가격 조회*/
public int getTotalPrice() {
int totalPrice = 0; //0으로 초기화
for(OrderItem orderItem :orderItems) { //for문을 돌려서
totalPrice += orderItem.getTotalPrice(); //totalPrice 총 가격알아내기
}
return totalPrice;
}
OrderItem class로 가서
private int orderPrice; //주문 가격
private int count; //주문 수량
public int getTotalPrice() {
return getOrderPrice() * getCount(); //주문가격*주문수량
}
2.주문 리포지토리 개발
OrderRepository class (jpabook.jpashop.repository)
jpa에서 (주문내역에서 검색기능은 동적쿼리가 들어가는데 )동적쿼리를 어떻게 해결해야할까?