Spring 비지니스 로직과 웹 계층

Bluewind·2022년 4월 28일
0

Spring

목록 보기
2/5

먼저, API를 만들기 위해서는 3개의 클래스가 필요합니다.

  • Request 데이터를 받을 DTO
  • API 요청을 받을 Controller
  • 트랜잭션, 도메인 기능 간의 순서를 보장하는 Service

여기서 많은 분들이 오해하고 계신 것들이 Service에서 비지니스 로직을 처리해야한다는 것입니다. Service 에서는 트랜잭션, 도메인 간의 순서 보장의 역할만 합니다. 그렇다면 비지니스 로직은 누가 처리할까요?

Spring 웹 계층

  • Web Layer
    • 흔히 사용하는 컨트롤러(@Controller)와 뷰 템플릿 영역입니다.
    • 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice)등 외부 요청과 응답에 대한 전반적인 영역을 이야기 합니다.
  • Service Layer
    • @Service에 사용되는 서비스 영역입니다.
    • 일반적으로 컨트롤러와 Dao 중간 영역에서 사용됩니다
    • @Transactional 이 사용되어야 하는 영역입니다.
  • Repository Layer
    • DB와 같이 데이터 저장소에 접근하는 영역입니다
  • Dtos
    • Dto(Data Transfer Object)는 계층간에 데이터 교환을 위한 객체를 이야기하며 Dtos는 이들의 영역을 말합니다.
    • 예를 들어 뷰 탬플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등이 해당됩니다.
  • Domain Model
    • 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 합니다.
    • 예를들어 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있습니다.
    • @Entity가 사용된 영역 역시 도메인 모델입니다.
    • 무조건 DB의 테이블과 관계가 있어야만 하는것은 아닙니다.
    • VO 처럼 값 객체들도 이 영역에 해당하기 때문입니다.

비지니스 로직

비지니스 처리를 담당해야 할 곳은 Domain 입니다.
예를 들어 주문 취소 서비스 로직을 작성한다면 아래와 같습니다.

@Transactional
public Order cancelOrder(int orderId) {
    // 1. DB로부터 주문정보, 결제정보, 배송정보 조회
    Orders order = ordersRepository.findById(orderId);
    Billing billing = billingRepository.findByOrderId(orderId);
    Delivery delivery = deliveryRepository.findByOrderId(orderId);

    // 2-3 배송 취소를 해야하는지 확인하고 배송중이라면 배송 취소
    delivery.cancel();

    // 4 각 테이블에 취소 상태 update
    order.cancel();
    billing.cancel();

    return order;
}

order, billing, delivery가 각자 본인의 취소 이벤트 처리를 하며, 서비스는 트랜잭션과 도메인 간의 순서만 보장해주게 됩니다.

출처

  • 이동욱 저자의 <스프링부트와 AWS로 혼자 구현하는 웹 서비스>
profile
NO EFFORT, NO RESULTS

0개의 댓글