각 개층을 명확히 해주는 애매한 계층

개념

Service Layer는 애플리케이션의 비즈니스 로직과 트랜잭션 경계를 정의하는 계층입니다. 도메인 로직과 데이터 접근 계층 사이에서 중재자 역할을 합니다.

구현방법

실생활 비유

레스토랑의 매니저와 비슷합니다:

코드 예시

// Service Layer 구현
public class OrderService {
    private OrderRepository orderRepository;
    private CustomerRepository customerRepository;
    private PaymentGateway paymentGateway;

    @Transactional  // 트랜잭션 경계 설정
    public OrderResult processOrder(OrderRequest request) {
        try {
            // 1. 고객 정보 검증
            Customer customer = customerRepository.findById(request.getCustomerId());
            if (customer == null) {
                throw new BusinessException("고객을 찾을 수 없습니다");
            }

            // 2. 주문 생성
            Order order = new Order(customer, request.getItems());

            // 3. 결제 처리
            PaymentResult payment = paymentGateway.processPayment(
                order.calculateTotal(),
                request.getPaymentInfo()
            );

            // 4. 주문 저장
            if (payment.isSuccessful()) {
                orderRepository.save(order);
                return new OrderResult(order, payment);
            } else {
                throw new PaymentFailedException("결제 실패");
            }
        } catch (Exception e) {
            // 롤백은 @Transactional에 의해 자동으로 처리됨
            throw new OrderProcessingException("주문 처리 실패", e);
        }
    }

    public List<OrderSummary> getCustomerOrders(Long customerId) {
        return orderRepository.findByCustomerId(customerId)
            .stream()
            .map(OrderSummary::new)
            .collect(Collectors.toList());
    }
}

주요 기능

  1. 트랜잭션 관리
  2. 비즈니스 로직 조율
  3. 예외 처리

장점

  1. 관심사 분리
  2. 재사용성