728x90
Spring Web 계층
- Web Layer
- Controller, JSP/Freemarker 등의 뷰 템플릿 영역
- 이외에도 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답에 대한 전반적인 영역
- Service Layer
- @Service에 사용되는 서비스 영역
- 일반적으로 Controller와 Dao의 중간 영역에서 사용
- Repository Layer
- DB와 같이 데이터 저장소에 접근하는 영역
- Dtos
- Dto는 계층 간 데이터 교환을 위한 객체들의 영역을 의미
- ex) 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등이 해당
- Domain Model
- Domain이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해하고 공유할 수 있도록 단순화 시킨 것
- 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있다.
- @Entity가 사용된 영역 역시 도메인 모델이라고 이해 가능
- 무조건 DB의 테이블과 관계가 있어야만 하는 것은 아님
- VO처럼 값 객체들도 이 영역에 해당
비즈니스 로직의 처리
비즈니스 로직을 처리하는 방식에는 Service로 처리하는 방식(트랜잭션 스크립트), Domain Layer에서 처리하는 방식이 있다.
나 역시도 비즈니스 로직은 Service에서 처리해야 한다고 배웠는데 이 책에서는 Domain에서 처리해야 한다고 한다.
주문 취소 로직을 통해 두 방식을 비교해 보겠다.
1. Service
@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;
}
모든 로직이 서비스 클래스 내부에서 처리된다.
-> 서비스 계층이 무의미함, 객체는 단순한 데이터 덩어리
2. Domain
@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가 각자 본인의 취소 이벤트 처리를 하며 서비스 메소드는 트랜잭션과 도메인 간의 순서만 보장한다.
결론
Domain에서 비즈니스 처리를 하는 경우 각 객체들이 자신의 이벤트를 처리한다. 좀 더 객체를 활용하는 방법인 것이다
코드 또한 간결해지고 객체지향에 어울린다.
여러 패턴이 존재하고 무엇이 맞다..라는 건 없다고 생각한다. 각자 장단점이 있기 때문에 상황에 맞춰 사용하는 것이 좋을 듯 싶다!
참고 도서
https://book.naver.com/bookdb/book_detail.nhn?bid=15871738
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다.경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현합니다. JPA와 JUNIT 테스트, 그레이들, 머스테치, 스프링
book.naver.com
728x90
반응형
'개발 > Spring' 카테고리의 다른 글
[Spring Boot] 예외 처리 전략 - @ControllerAdvice를 이용한 Exception 처리 (0) | 2022.09.01 |
---|---|
CRUD API (0) | 2022.07.07 |
[Spring Boot] Spring Boot + Gradle 프로젝트에 JPA 적용 (0) | 2022.07.04 |
[SpringBoot] 테스트 코드 작성, TDD (0) | 2022.05.17 |
[SpringBoot] 인텔리제이로 스프링 부트 시작하기 (0) | 2022.05.16 |