아래는 Layered Architecture(계층형 아키텍처)를 중심 개념으로 두고,
Spring Boot의 Controller–Service–Repository 구조가 어떻게 논리적으로 대응되는지 명확하게 설명한 글입니다.

Layered Architecture(계층형 아키텍처)는 소프트웨어를 기능적 책임에 따라 수평적으로 분리하는 구조를 말한다.
일반적으로 다음 네 개의 계층으로 구성된다.
각 계층은 명확한 책임을 가지며, 의존성은 상위 계층 → 하위 계층으로만 향해야 한다.
즉, Presentation은 Application에만 의존할 수 있고, Application은 Domain에만 의존할 수 있으며, Domain은 어떠한 상위 계층에도 의존하지 않아야 한다.
Spring Boot의 Controller–Service–Repository 구조는 이러한 계층형 아키텍처의 개념을 실무적으로 구현한 방식이다.
아래에서는 두 구조를 책임과 의존성 관점에서 분석한다.
핵심 책임: 외부(HTTP, UI 등)와 시스템 내부 사이의 인터페이스 역할
특징: 요청 파싱, 응답 생성, 인증·인가 처리
Spring 대응 요소:
@RestController의존성: Service(Application Layer)에게만 의존
Controller는 외부와의 접점을 담당하므로 Presentation Layer의 역할과 완전히 동일하다.
핵심 책임: 유스케이스 조율, 트랜잭션 경계 관리, 비즈니스 흐름 제어
특징:
Spring 대응 요소:
@Service 클래스@Transactional)의존성: Domain Layer(entity, domain logic)과 Infrastructure Layer(repository)에 의존 가능
Service가 유스케이스 단위로 흐름을 조율하는 특징은 Application Layer의 역할과 동일하다.
핵심 책임: 시스템이 해결하고자 하는 핵심 규칙 및 모델 정의
특징:
Spring 대응 요소:
@Entity도메인은 기술이 아니라 비즈니스 개념을 중심으로 설계되며, 엔티티가 이 역할을 담당한다.
핵심 책임: 실제 기술 구현(DB, Redis, 외부 API, 이벤트 브로커 등)
특징:
Spring 대응 요소:
Repository 인터페이스Repository는 데이터 접근의 기술적 구현이므로 Infrastructure 계층에 해당한다.
Layered Architecture는 다음과 같은 핵심 의존성 규칙을 가진다.
이는 계층형 아키텍처의 의존성 방향 원칙과 정확히 일치한다.
Layered Architecture의 개념을 물리적 폴더 이름(Presentation, Application 등)으로 만드는 것은 가능하다.
그러나 Spring 생태계에서는 Controller/Service/Repository라는 Type 기반의 명명법이 사실상 표준으로 자리 잡았다.
그 이유는 다음과 같다.
Infrastructure 계층의 코드를 개발자가 직접 작성할 일이 적다.
따라서 Infrastructure라는 폴더를 구성해도 현실적으로 비어 있는 경우가 많기 때문이다.
“상품 등록 API는 어디에 있는가?”라는 질문은 controller 폴더를 찾는 것만으로 해결되며,
이는 협업에서 불필요한 인지 부하를 줄인다.
Layered Architecture의 핵심은 의존성 구조와 책임 분리이며,
폴더 이름이 Presentation인지 Controller인지 여부와는 무관하다.
현재 Spring 표준 구조 또한 계층형 아키텍처의 개념적 규칙을 완벽히 충족한다.
Layered Architecture의 개념을 더 엄격히 적용하는 경우는 다음과 같은 상황이다.
이러한 상황에서는 Presentation, Application, Domain, Infrastructure를 물리적으로 나누는 것이 유지보수 효율을 높인다.
그러나 중·소규모 서비스 또는 일반적인 REST API 개발에서는
현재의 Spring 관습적 구조가 가장 단순하면서도 계층형 아키텍처의 원칙을 충실히 지킨 구현 방식이다.