먼저, API를 만들기 위해서는 3개의 클래스가 필요합니다.
여기서 많은 분들이 오해하고 계신 것들이 Service에서 비지니스 로직을 처리해야한다는 것입니다. Service 에서는 트랜잭션, 도메인 간의 순서 보장의 역할만 합니다. 그렇다면 비지니스 로직은 누가 처리할까요?
비지니스 처리를 담당해야 할 곳은 Domain 입니다.
예를 들어 주문 취소 서비스 로직을 작성한다면 아래와 같습니다.
@Transactional
public Order cancelOrder(int orderId) {
// 1. DB로부터 주문정보, 결제정보, 배송정보 조회
Orders order = ordersRepository.findById(orderId);
Billing billing = billingRepository.findByOrderId(orderId);
Delivery delivery = deliveryRepository.findByOrderId(orderId);
// 2-3 배송 취소를 해야하는지 확인하고 배송중이라면 배송 취소
delivery.cancel();
// 4 각 테이블에 취소 상태 update
order.cancel();
billing.cancel();
return order;
}
order, billing, delivery가 각자 본인의 취소 이벤트 처리를 하며, 서비스는 트랜잭션과 도메인 간의 순서만 보장해주게 됩니다.