많은 사람들이 오해하는 것이
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)
public Order cancelOrder(int orderId) {
1) DB로부터 주문정보 (Orders), 결제정보(Billing), 배송정보(Delivery) 조회
2) 배송 취소를 해야하는지 확인
3) if(배송 중이면) {
배송취소로 변경
}
4) 각테이블에 취소상태 Update
}
위에 모든 로직을 Service에서 처리하면, 객체란 단순히 데이터 덩어리 역할만 한다
// 위 슈도코드의 모든 로직을 Service에서 처리 (안좋은 예)
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
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 각 각자 본인의 취소 처리를하며서비스 메서드는 트랜잭션과 도메인 간의 순서만 보장해 준다.
'DEV > Spring' 카테고리의 다른 글
[SpringBoot] 어노테이션 정리(롬복,테스트,스프링) (0) | 2020.02.24 |
---|---|
[SpringBoot] 빈 주입은 @Autowired 대신에 생성자로 주입하라 (@RequiredArgsConstructor) (0) | 2020.02.20 |
[SpringBoot] 기본 테스트코드 작성하는 법, 어노테이션 정리 (0) | 2020.02.18 |
[JPA] 스프링부트 쿼리 로그보기 (0) | 2020.02.18 |
[JPA] JPA 세팅, h2(인메모리 관계형 데이터 베이스), 어노테이션정리 (0) | 2020.02.18 |