@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 order = Order.createOrder(member, delivery, orderItem);
// 주문 저장
orderRepository.save(order);
return order.getId();
}
}
저장 할 때 order만 save했다.
어디까지 cascade 해야 되는지 많이들 고민한다.
Order → OrderItem
Order → Delivery
참조 할 때 주인이 1개일 경우만 써야 한다.
만약 누군가가 생성 메소드를 사용하지 않는 경우는 나중에 유지보수 하기 힘들다.
이것을 막는 방법이 있다.
protected OrderItem() {
}
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class OrderItem {
코드를 항상 이렇게 제약 스타일로 짜는 것이 좋다.
@Transactional
public void cancelOrder(Long orderId) {
// 주문 엔티티 조회
Order order = orderRepository.findOne(orderId);
// 주문 취소
order.cancel();
}