Mini

주문 서비스 개발 // 도메인 모델 패턴, 생성자제한, CASCADE, 변수 수정쿼리 본문

Java/Spring-app

주문 서비스 개발 // 도메인 모델 패턴, 생성자제한, CASCADE, 변수 수정쿼리

Mini_96 2023. 6. 13. 02:08

* 도메인 모델 패턴

엔티티 클래스(Order) : 비즈니스 로직 구현(createOrder 빡구현)

서비스 클래스(OrderService) : 단순히 요청만함.(createOrder)

package jpabook.jpashop.domain;

import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import jpabook.jpashop.repository.MemberRepository;
import jpabook.jpashop.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

    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 기본생성자에 Protected 걸어
        해결2 : 롬복 : @NoArgsConstructor(access= AccessLevel.PROTECTED)
         */
        Order order=Order.createOrder(member,delivery,orderItem);
        //new Order() XXX

        //주문 저장
        /* CASCADE
        문제 : delivery, orderitem은 persist안함?
        해결 : order클래스에 cascade걸려잇는멤버 => order persist -> 자동persist
        문제1 : orderitem, delivery을 order에서만 참조하는 경우에만 사용할것!
        문제2 : delivery, orderitem을 여러군데서 사용하는경우?
        해결 : 별도의 repository => 각각 persist
         */
        orderRepository.save(order);

        return order.getId();
    }

    /**
     * 주문 취소
     */
    @Transactional
    public void cancleOrder(Long orderId){
        //주문 엔티티 조회
        Order order=orderRepository.findOne(orderId);
        //주문 취소
        order.cancel();
        /*
        문제 : JPA안쓰면, 실제 stock 을 바꾸는 update SQL 짜야함
        해결 : JPA사용시, 변수바꾸는것만으로 알아서 해줌(dirty check)
         */
    }

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