spring 과제

[TIL] Spring 계층 구조와 비즈니스 로직 분리의 근거

2026-04-20 | Backend Development

1. 과제 정리 

Spring Boot 프로젝트에서 Entity, DTO, Controller, Repository, Service로 계층을 나누는 이유와, 특히 Controller에 집중되어 있던 로직을 Service로 왜 분리해야 할까?

2. 문제 상황: Controller에 비즈니스 로직이 있는 경우

기존 OrderController 코드에서는 ProductRepositoryOrderRepository를 직접 의존하며 DB 조회 및 주문 생성 로직을 수행

  • 단일 책임 원칙(SRP) 위반: Controller는 클라이언트의 요청을 받고 응답하는 역할에 집중해야 하지만, 데이터 검증 및 비즈니스 흐름까지 제어
  • 트랜잭션 관리의 한계: @Transactional이 Controller에 붙어 있어 계층 간의 경계가 모호해진다.

3. 계층별 역할(Layered Architecture)

계층(Layer) 주요 역할
Entity 실제 DB 테이블과 매핑되는 객체, 핵심 비즈니스 도메인 모델
DTO 계층 간 데이터 전송을 위한 객체 (Request/Response 분리)
Controller HTTP 요청 매핑, 파라미터 검증(@Valid), 응답 반환
Service 비즈니스 로직 수행, 트랜잭션 단위 관리, 다수의 Repository 조율
Repository DB 접근 로직 (Spring Data JPA 활용)

4. 로직 분리의 기술적 근거 (Service 계층의 필요성)

① 재사용성 (Reusability)
주문 생성 로직이 Controller에 있으면, 다른 서비스(예: 관리자 API, 예약 시스템)에서 동일한 주문 로직이 필요할 때 코드를 복사해야 합니다. Service로 분리하면 다른 클래스에서 orderService.createOrder()를 주입받아 바로 사용할 수 있다.
② 유지보수성 (Maintainability)
DB 구조가 바뀌거나 주문 정책(예: 할인 적용 등)이 변경될 때 Controller를 수정할 필요가 없다. 오직 Service 계층만 수정하면 되므로 변화에 유연합니다.
③ 트랜잭션 원자성 (Atomicity)
주문 생성 시 재고 감소, 포인트 적립 등 여러 DB 작업이 묶여야 할 때, @Transactional을 Service 메서드에 선언함으로써 하나의 작업 단위(Unit of Work)로 안전하게 관리할 수 있다. 

5.정리

단순한 CRUD 프로젝트에서는 Controller에 로직을 다 넣어도 동작에는 문제가 없다.
하지만 확장을  위해서는 각 객체의  명확히 분리하는 것이 핵심이다.

'스파르타 심화 과정' 카테고리의 다른 글

모니터링과 부하테스트  (0) 2026.06.02
CQRS  (0) 2026.05.26
4/20 Spring 기초(2) 특강  (0) 2026.04.20
spring 특강 1  (0) 2026.04.20
4월 15일 과제  (0) 2026.04.15