많은 분들이 오해하고 계신 것이, Service에서 비지니스 로직을 처리해야 한다는 것입니다.
하지만, 전혀 그렇지 않습니다.
Service는 트랜잭션, 도메인 간 순서 보장의 역할만 합니다.스프링 부트와 AWS로 혼자 구현하는 웹서비스
주문을 취소하고자 할 때, 다음과 같은 비즈니스 로직으로 처리한다고 가정한다.
// 코드 출처 : 스프링 부트와 AWS로 혼자 구현하는 웹서비스
@Transactional
public Order cancelOrder(int orderId) {
// 1)
OrderDto order = orderDao.selectOrders(orderId);
BiliingDto billing = billingDao.selectBilling(orderId);
DeliveryDto delivery = deliveryDao.selectDelivery(orderId);
// 2)
String deliveryStatus = delivery.getStatus();
// 3)
if("IN_PROGRESS".equals(deliveryStatus)) {
delivery.setStatus("CANCEL");
deliveryDao.update(delivery);
}
// 4)
order.setStatus("CANCEL");
orderDao.update(order);
billing.setStatus("CANCEL");
deliveryDao.update(billing);
return order;
}
모든 로직이 서비스 클래스 내부에서 처리되기 때문에, 서비스 계층이 무의미하게 되고, 객체란 단순히 데이터 덩어리역할만 하게 됩니다.
// 코드 출처 : 스프링 부트와 AWS로 혼자 구현하는 웹서비스
@Transactional
public Order cancelOrder(int orderId) {
// 1)
Orders order = ordersRepository.findById(orderId);
Billing billing = billingRepository.findByOrderId(orderId);
Delivery delivery = deliveryRepository.findByOrderId(orderId);
// 2-3)
delivery.cancel();
// 4)
order.cancel();
billing.cancel();
return order;
}
order
, billing
, delivery
가 각자 본인의 이벤트 처리를 하며, 서비스 메소드는 트랜잭션과 도메인간의 순서만 보장해줍니다.