반응형
Spring의 웹 계층
Web Layer
- 흔히 사용하는 Controller와 JSP 등의 뷰 템플릿 영역이다.
- 이외에도 filter, interceptor, ControllerAdvice 등 외부 요청과 응답에 대한 전반적인 영역이다.
Service Layer
- @Service에 사용되는 서비스 영역이다.
- 일반적으로 Controller와 DAO의 중간 영역으로 사용된다.
- @Transcational이 사용되어야 하는 영역이다.
Repository Layer
- DB와 같이 데이터 저장소에 접근하는 영역이다.
- DAO(Data Access Object)영역이다.
DTOs
- DTO(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체를 DTOs는 그 영역이다.
- Web Layer에서 사용될 객체나 Repositroy Layer에서 결과로 넘겨주는 객체 등이다.
Domain Model
- 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 한다. (ex. 택시앱에서 배차, 탑승, 요금 등은 모두 도메인)
- JPA의 경우 @Entity를 사용된 영역이 도메인 모델이다.
- 다만, 무조건 DB의 테이블과 관계가 있어야만 도메인은 아니다.
- VO(Value Object)처럼 값 객체들도 이영역 해당된다.
트랜잭션 스크립트와 도메인 모델
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@Transactional
public Order cancelOrder(int orderId){
//1) 주문정보, 결제정보, 배송정보 조회
OrdersDto 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");
delveryDao.update(billing);
return order;
}
|
흔히 Service에서 비지니스 로직을 처리하는 방식을 사용한다. 이 방법은 트랜잭션 스크립트 패턴이라고 불린다. 이 방식에서는 Service에서 모든 비지니스 로직을 처리하기 때문에 구현이 매우 쉽고 단순하지만 구조가 복잡해질 수록 모듈화의 복잡도도 높아지게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Transactional
public Order cancelOrder(int orderId){
//1) 주문정보, 결제정보, 배송정보 조회
OrdersDto order = ordersDao.selectOrders(orderId);
BillingDto billing = billingDao.selectBilling(orderId);
DeliveryDto delivery = deliveryDao.selectDelivery(orderId);
//2)배송 취소 여부 확인 - 3)배송중이라면 배송취소
delivery.cancel();
//4)각 테이블에 취소상태 갱신
order.cancel();
biling.cancel();
return order;
}
|
이와 반대로 Domian에서 비지니스 로직을 처리하는 방식을 도메인 모델 패턴이라고 한다. 이 방식은 객체에 객체가 수행해야 하는 업무를 분담시키는 것으로써 Service에서는 트랜잭션, 도메인 간의 순서보장의 역할만을 제공하고 비지니스 로직을 Domain에서 처리하는 방식이다.
출처
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 프리렉 출판, 이동욱 저
leveloper.tistory.com/14
jins-dev.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-2%EA%B0%80%EC%A7%80-%EB%A1%9C%EC%A7%81-%ED%8C%A8%ED%84%B4-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%AA%A8%EB%8D%B8Domain-Model-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Transaction-Script
반응형
'Java&Web' 카테고리의 다른 글
[JUnit] Mockito를 이용한 단위 테스트 (0) | 2021.02.02 |
---|---|
[WEB] RestTemplate을 이용하여 API 호출하기 (2) | 2021.01.23 |
[Enum] Enum을 Binding해주는 Custom Converter (0) | 2021.01.13 |
[MyBatis] Enum을 MyBatis 환경에서 사용하기 (0) | 2021.01.12 |
[MyBatis] Springboot에 MyBatis-Spring 설정하기(2) (0) | 2021.01.04 |