객체지향적으로 개발하기

HyeonWoo·2021년 1월 30일
0

스프링 & JPA

목록 보기
23/34
post-thumbnail

이번 장에서는 그동안 Service Layer에 대한 오해와 객체지향적 개발에 대해 알아보고자 한다.


Spring 웹 계층

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

Business Logic 처리를 담당해야 하는 계층은??

많은 개발자들이 Business Logic이 Service Layer에 들어간다고 오해를 하고 있다. 나 또한 그렇게 알고 있었다.

아래 코드를 보면.

@Transactional
public Order cancelOrder(int orderId) {

    OrdersDto order = ordersDao.selectOrders(orderId);
    BillingDto billing = billingDao.selectBilling(orderId);
    DeliberyDto delivery = deliveryDao.selectDelivery(orderId);
    
    String deliveryStatus = delivery.getStatus();
    
    if("IN_PROGRESS".equals(deliberyStatus)){
    	delivery.setStatus("CANCEL");
        delivery.update(delivery);
     }
     
     order.setStatus("CANCEL");
     orderDao.update(order);
     
     billing.setStatus("CANCEL");
     deliveryDao.update(billing);
     
     return order;
     
}
  • 객체 지향적 개발이라기 보다는 절차지향적인 개발에 가깝게 볼 수 있다.
  • Business Logic을 Service Layer에 포함시키고 Domain 객체에서는 단순한 get, set등의 역할만 해주고 있다.

절차지향 프로그래밍 : 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법

위 코드를 도메인 모델에서 처리할 경우

@Transactional
public Order cancelOrder(int orderId) {

   OrdersDto order = ordersDao.selectOrders(orderId);
   BillingDto billing = billingDao.selectBilling(orderId);
   DeliberyDto delivery = deliveryDao.selectDelivery(orderId);
   
   delivery.cancel();
   
   order.cancel();
   billing.cancel();
    
   return order;
    
}
  • Service Layer는 트랜잭션과 도메인 간의 순서만 보장해준다.
  • 객체에게 일을 시키고 메시지를 던진다.

정리

Service Layer에서 해줘야 하는 역할

  • 다른 기능의 Service를 호출하거나 다수의 DAO를 연결하는 역할.
  • Transaction과 Cache 적용과 같은 infra 적용을 위한 단위가 된다.
  • Service는 가능한 가볍게 구현한다. (thin Layer)
  • Service에 핵심 비즈니스 로직을 구현하지 말고, 로직은 상태 값을 가지고 있는 모델(또는 도메인)이 담당 한다.

앞으로 Business Logic 코드들이 도메인들이 담당하도록 Refactoring하면서 객체지향적으로 개발하는 습관을 들여야겠다.


참고
https://wckhg89.tistory.com/13,
스프링 부트와 AWS로 혼자 구현하는 웹 서비스

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글