* 도메인 모델 패턴
엔티티 클래스(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);
}*/
}
'Java > Spring-app' 카테고리의 다른 글
주문 검색 기능 개발 // 동적쿼리해결방법 (0) | 2023.07.04 |
---|---|
주문 기능 테스트 //@Test, Assert (0) | 2023.06.20 |
주문 리포지토리 개발 (0) | 2023.06.13 |
주문, 주문상품 엔티티 개발 // 복잡한생성은 생성메서드 (0) | 2023.06.08 |
상품 서비스 개발 (1) | 2023.06.08 |