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