JAVA SPRING/PROJECT

[Day-9] 주문 엔티티, 리파지토리, 서비스

sshhhh 2023. 8. 25.

 

<주문 도메인 개발>

#주문 엔티티 개발(비즈니스 로직 추가)

domain - Order

//==생성메서드==//
//회원,배송,주문내역 넘기기 (...: 여러개)
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) {
    Order order = new Order();
    order.setMember(member);
    order.setDelivery(delivery);
    for (OrderItem orderItem : orderItems) { // 위에 선언 private List<OrderItem> orderItems = new ArrayList<>();
        order.addOrderItem(orderItem);
    }
    order.setStatus(OrderStatus.ORDER); //초기값을 order로 강제해둔다
    order.setOrderDate(LocalDateTime.now());

    return order;
}

//==비즈니스로직==//

//주문 취소
public void cancel() {
    //배송이 끝나면 취소 불가
    if (delivery.getStatus() == DeliveryStatus.COMP) {
        throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
    }

    //vaildation을 통과하면 주문 상태 바꿀 수 있다.
    this.setStatus(OrderStatus.CANCEL);
    for (OrderItem orderItem : orderItems) {
        orderItem.cancel(); //

    }
}

//==조회 로직==//

//전체 주문 가격 조회
public int getTotalPrice(){
    int totalPrice =0;
    for(OrderItem orderItem : orderItems){
        totalPrice += orderItem.getTotalPrice();
    }
    return totalPrice;
}

 

domain - 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;
}


//==비즈니스로직==//
public void cancel() {
    getItem().addStock(count); //취소 -> 주문수량만큼 재고 올리기
}


//==조회로직==//
//주문상품전체가격조회
public int getTotalPrice() {
     return getOrderPrice() * getCount(); //가격*수량
}

 

domain -Item

//비즈니스 로직

/*
재고 증가
 */
public void addStock(int quantity){
    this.stockQuantity+=quantity;
}

/*
재고 감소
 */
public  void  removeStock(int quantity){
    int restStock = this.stockQuantity -quantity;
    if(restStock <0 ){
        throw  new NotEnoughStockException("need more stock");
    }
    this.stockQuantity =restStock;

 

 

#주문 리파지토리 개발

 

OrderRepository

@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){}
}

 

 

#주문 서비스 개발 

 

OrderService

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderService {

    //엔티티 조회하느라 의존관계 넣음
    private final OrderRepository orderRepository;
    private final MemberRepository memberRepository;
    private final ItemRepository itemRepository;

    /*
    주문
     */
    @Transactional   //ID로 member,item 정보 받아옴 , 주문수량
    public Long order(Long memberId, Long itemId, int count) {

        //member를 찾자 엔티티 조회
        Member member = memberRepository.fineOne(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);
        //new Order();

        //주문 저장
        orderRepository.save(order);
        return order.getId(); //식별자(@id)값만 반환


    }


    //주문 취소
    @Transactional
    public void cancelOrder(Long orderId) {
        //주문 엔티티 조회
        Order order = orderRepository.findOne(orderId);
        //주문취소
        order.cancel();
    }


//주문 검색 
/*
 public List<Order> findOrders(OrderSearch orderSearch) {
 return orderRepository.findAll(orderSearch);
 }
*/

}

 

 


#참고

주문 서비스의 주문과 주문 취소 메서드를 보면 비즈니스 로직 대부분이 엔티티에 있다.

서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할을 한다.

이처럼 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것을

도메인 모델 패턴(http://martinfowler.com/eaaCatalog/domainModel.html)이라 한다.

 

반대로 엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을

트랜잭션 스크립트 패턴(http://martinfowler.com/eaaCatalog/transactionScript.html)이라 한다

 

 

 

 

 

강의 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

댓글