비즈니스 로직의 처리

그저늅늅·2022년 5월 12일
0

JPA

목록 보기
6/6
post-thumbnail

스프링 부트와 AWS로 혼자 구현하는 웹서비스 책을 읽으며 정리한 글입니다.

많은 분들이 오해하고 계신 것이, Service에서 비지니스 로직을 처리해야 한다는 것입니다.
하지만, 전혀 그렇지 않습니다.
Service는 트랜잭션, 도메인 간 순서 보장의 역할만 합니다.

스프링 부트와 AWS로 혼자 구현하는 웹서비스

Spring Web 계층

Service Layer와 Domain Model에서의 비즈니스 로직 처리의 차이점

주문을 취소하고자 할 때, 다음과 같은 비즈니스 로직으로 처리한다고 가정한다.

  1. DB로부터 주문정보, 결제 정보, 배송정보 조회
  2. 배송 취소를 해야 하는지 확인
  3. 배송중이라면 배송취소로 변경
  4. 각 테이블에 취소 상태 Update

Service Layer에서 처리할 경우

// 코드 출처 : 스프링 부트와 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;
}

모든 로직이 서비스 클래스 내부에서 처리되기 때문에, 서비스 계층이 무의미하게 되고, 객체란 단순히 데이터 덩어리역할만 하게 됩니다.

Domain Model에서 처리할 경우

// 코드 출처 : 스프링 부트와 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가 각자 본인의 이벤트 처리를 하며, 서비스 메소드는 트랜잭션과 도메인간의 순서만 보장해줍니다.

profile
양현석

0개의 댓글