Study/실전! 스프링 부트와 JPA 활용1
주문 개발 3 (OrderService- 주문 개발)
Subi
2022. 7. 15. 12:23
주문에 대한 서비스를 만드는 작업은
일단 Service 디렉토리 밑에
OrderService 클래스를 생성시켜준다.
그리고
OrderRepository, MemberRepository, ItemRepository 를 인젝션 받아준다.
private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;
첫번째로 주문에 대한 메서드를 만든다.
@Transactional
public Long order(Long memberId,Long itemId, int count){
//엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);
//배송정보 생성
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
//주문상품 생성
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
//주문 생성
Order order = Order.createOrder(member, delivery, orderItem);
//주문 저장
orderRepository.save(order);
return order.getId();
}
주문을 진행할 때 에는 일단 주문한 회원을 가져오고, 배송에 대한정보, 주문하는 상품을 가져온다음
주문을 생성시키고 테이블에 저장을 시키게 된다.
두번째로는 주문 취소에 대한 메서드를 만든다.
@Transactional
public void cancelOrder(Long orderId){
//주문 엔티티 조회
Order order = orderRepository.findOne(orderId);
//주문 취소
order.cancel();
}
주문 취소에 대한 로직은 주문 엔티티를 조회해서 주문을 취소시켜주는 로직이다.
Order 엔티티에
cancel 메서드를 만들어 상품 수량에 대한 증,차감에 대한 메서드를 만들어놓았기 때문에
다른 로직이 필요없이 주문 취소 시 상품에 증,차감 이 이루어지게 된다.
public void cancel(){
if(delivery.getStatus() == DeliveryStatus.COMP){
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for(OrderItem orderItem : orderItems){
orderItem.cancel();
}
}
강의 : 인프런 실전! 스프링 부트와 JPA 활용1 (김영한) https://inf.run/VMWU