🤨 그렇다면 진짜 비즈니스 로직은 어디에 가야 하나요? Domain으로 가야 합니다.

트랜잭션 스크립트

기존에 서비스에서 비즈니스를 처리하는 방법을 트랜잭션 스크립트라고 합니다. 아래 트랜잭션 스크립트처럼 모든 로직이 서비스에서 처리 되면 서비스 계층이 무의미하며 객체는 단순한 데이터 덩어리가 됩니다. sudo code

@Transactional
public Order cancelOrder(int orderId){
    1) DB로부터 주문정보, 결제정보, 배송정보 조회
    2) 배송 취소를 해야하는지 확인
    3) if(배송 중이라면){
            배송 취소
        }
    4) 각 테이블에 취소 상태 UPDATe
}

트랜잭션 스크립트

public class OrderService{
  
    @Transactional 
    public Order cancelOrder(int orderId) {
        // 1)
        OrderDto order = ordersDao.selectOrders(orderId);
        BillingDto 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");
        ordersDao.update(order);
        billing.setStatus("CANCEL");
        deliveryDao.update(billing);
    
        return order;
    }
}

도메인 모델

public class OrderService{

  @Transactional
  public Order cancelOrder(int orderId) {
    // 1)
    OrderDto order = ordersDao.selectOrders(orderId);
    BillingDto billing = billingDao.selectBilling(orderId);
    DeliveryDto delivery = deliveryDao.selectDelivery(orderId);

    // 2-3)
    delivery.cancel();

    // 4)
    order.cancel();
    billing.cancel();

    return order;
  }
}

Web Layer(웹 계층) 과 도메인 모델 패턴

Web Layer(웹 계층) 과 도메인 모델 패턴

  1. Web Layer
    • 외부 요청과 응답에 대한 영역
  2. Service Layer
    • 트랜잭션의 영역
    • Controller와 DAO 사이의 중재자
  3. Repository Layer
    • 데이터에 접근하는 영역
    • DAO로 이해해도 무방합니다.
  4. DTO
    • 계층간 데이터 교환을 위한 객체
  5. Domain Model
    • 개발 대상을 객체화 할 수 있도록 단순하게 개념화한 걸 도메인모델이라고 합니다.
    • 값을 담은 클래스를 도메인모델이라고 봐도 무방할 것 같습니다.

Request 데이터를 받는 DTO API 요청을 받는 Controller 트랜잭션 처리를 하는 Service 비즈니스 로직을 담당하는 Domain

댓글남기기