goblin
리니팅
goblin

공지사항

전체 방문자
오늘
어제
  • 분류 전체보기 (75)
    • 개발 (31)
      • Spring (12)
      • JPA (4)
      • JAVA (4)
      • Python (6)
      • Docker (1)
      • Error (3)
      • Spring Cloud로 개발하는 MSA (1)
    • 알고리즘 (32)
    • 자료구조 (3)
    • 컴퓨터 개론 (3)
    • 개인 프로젝트 (4)
      • 쇼핑몰 만들기 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • python
  • 파이썬
  • 자료구조
  • 알고리즘
  • gradle
  • 코딩테스트
  • 클래스
  • tdd
  • Intellij
  • dp
  • 조합
  • 구현
  • 백준
  • 다이나믹프로그래밍
  • 객체
  • inflearn
  • 문자열
  • 정렬
  • 스프링
  • 코딩테스트연습
  • 다이나믹 프로그래밍
  • sorting
  • 동적계획법
  • 파워자바
  • springboot
  • Spring
  • BOJ
  • 프로그래머스
  • 스프링부트
  • JPA

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
goblin

리니팅

개발/Spring

[Spring Boot] 도메인 계층에서 비즈니스 로직 처리

2022. 7. 5. 19:39
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
    '개발/Spring' 카테고리의 다른 글
    • [Spring Boot] 예외 처리 전략 - @ControllerAdvice를 이용한 Exception 처리
    • CRUD API
    • [Spring Boot] Spring Boot + Gradle 프로젝트에 JPA 적용
    • [SpringBoot] 테스트 코드 작성, TDD
    goblin
    goblin

    티스토리툴바