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());
}
}