@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();
	}
}

만약 누군가가 생성 메소드를 사용하지 않는 경우는 나중에 유지보수 하기 힘들다.

이것을 막는 방법이 있다.

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();
}