Java&Web

[WEB] Spring의 웹 계층과 트랜잭션 스크립트, 도메인 모델

프로그래민 2021. 1. 17. 16:53
반응형

Spring의 웹 계층

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
반응형