많은 사람들이 오해하는 것이

Service에서 비니지스 로직을 처리한다는 것인데 전혀 그렇지 않다.

Service는 트랜잭션, 도메인간 순서 보장의 역할만 한다.

비니지스 로직을 처리를 담당하는 곳은 Domain 이다




스프링의 웹 계층

Web(Controller), Servie, Repository, Dto, Domain

  • Web Layer

    • 컨트롤러와 뷰 템플릿 영역

    • 이외에도 필터, 인터셉터, 컨트롤러어드바이스(@Controller Advice) 등 외부 요청과 응답에 대한 전반적인 영역


  • Service Layer

    • @Service

    • 일반적으로 Conroller와 Dao의 중간 영역

    • @Transaction이 사용되야 하는영역


  • Repository Layer

    • DB와 같이 데이터 저장소에 접근하는 영역

    • Dao 영역으로 이해하면 된다


  • Dtos

    • Data Transfer Object 의 영역

    • 계층간에 데이터 교환

    • 뷰 템플릿엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등


  • Domain Model

    • 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것

    • @Entity가 사용된 영역 역시 도메인 모델

    • 무조건 DB와 관계가 있어야 하는건 아니고 VO처럼 값 객체들도 이 영역에 해당



비지니스 로직을 처리하는건 Service가 아니라 Domain이다.

아래의 예를 봅시다.


// 슈도 코드 (service)
@Transactional
public Order cancelOrder(int orderId) {
1) DB로부터 주문정보 (Orders), 결제정보(Billing), 배송정보(Delivery) 조회
   
2) 배송 취소를 해야하는지 확인
   
3) if(배송 중이면) {
배송취소로 변경
}
4) 각테이블에 취소상태 Update
}



위에 모든 로직을 Service에서 처리하면, 객체란 단순히 데이터 덩어리 역할만 한다

// 위 슈도코드의 모든 로직을 Service에서 처리 (안좋은 예)
@Transactional
public Order cancelOrder(int orderId) {
 // 1)
 OrdersDto order = orderDao.selectOrder(orderId);
 BillingDto billing = billingDao.selectBilling(orderId);
 DeliveryDto delivery = deliveryDao.selectDelivery(orderId);

 // 2)
 String deliveryStatus = delivery.getStatus();

 // 3)
 if("IN_PROGRESS".equals(delivery.getStatus)) {
   delivery.setStatus("CANCEL");
   deliveryDao.update(delivery);
}

 // 4)
 order.setStatus("CANCEL");
 ordersDAO.update(order);

 billing.setStatus("CANCEL");
 deliveryDao.update(billing);

 return order;
}




비니지스 로직을 모델에서 처리할 경우의 Service

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

 // 2 ~ 3)
 delivery.cancel()

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

 return order;
}



order, billing, delivery 각 각자 본인의 취소 처리를하며

서비스 메서드는 트랜잭션과 도메인 간의 순서만 보장해 준다.


+ Recent posts