시스템 복잡도 증가에 따른 유지보수성 향상을 위해 컨트롤러(Controller)와 서비스(Service) 레이어를 분리하는 설계 방식을 정리했다.
계층별 책임 정의
역할에 따라 클래스를 분리하여 코드의 명확성을 확보한다.
1. Controller: 요청 제어
사용자 요청을 수신하고 응답 방식을 결정하는 인터페이스 역할을 수행한다.
@RestController
public class OrderController {
private final OrderService orderService;
@PostMapping("/order")
public ResponseEntity<String> placeOrder(@RequestBody OrderRequest request) {
// 요청 수신 후 서비스 호출 및 결과 응답
orderService.processOrder(request);
return ResponseEntity.ok("주문이 성공적으로 접수되었습니다.");
}
}
2. Service: 비즈니스 로직 실행
핵심 로직(연산, 데이터 가공, 트랜잭션 관리 등)을 수행하는 처리 영역이다.
@Service
public class OrderService {
private final InventoryRepository inventoryRepository;
private final OrderRepository orderRepository;
@Transactional
public void processOrder(OrderRequest request) {
// 재고 확인, 결제 처리, DB 저장 등 비즈니스 로직 수행
}
}
레이어 분리의 이점
- 책임 분리: 컨트롤러는 외부 통신에, 서비스는 내부 로직에 집중한다.
- 재사용성: 서비스 로직은 다양한 클라이언트(웹, 모바일 등)에서 공통으로 사용할 수 있다.
- 유지보수 효율: 로직 수정 시 컨트롤러에 미치는 영향을 최소화하며, 그 반대의 경우도 동일하다.
설계 원칙
레이어 분리는 변동성이 큰 외부 인터페이스(컨트롤러)와 핵심 가치인 비즈니스 로직(서비스)을 분리하는 과정이다.
이러한 구조는 프로젝트 규모 확장 시에도 시스템의 안정성을 유지하게 하는 것 같다.