Spring 애플리케이션에서 이 구조는 계층 간 책임 분리와 유지보수성 향상을 위해 핵심적인 역할을 한다.
이 구조는 3계층 아키텍처(Three-tier architecture)의 한 형태이다:
| 계층 | 책임 역할 | 예시 |
|---|---|---|
| Controller | 외부 요청 처리, 응답 반환 (API 진입점) | HTTP 요청 매핑 |
| Service | 비즈니스 로직 수행 | 사용자 등록, 주문 처리 등 |
| Repository | DB 접근, 데이터 조회/저장 | JPA, JDBC 등을 이용한 DB 연동 |
new로 직접 생성하면 강한 결합이 생김public class UserService {
private UserRepository repo = new UserRepository(); // ❌ 강한 결합
}
이렇게 하면 계층 간 결합도는 낮추고 유연성은 높임
@Component, @Service, @Repository, @Controller 등을 붙이면 Bean으로 등록됨new로 만들지 않고, Spring이 필요한 객체를 자동으로 넣어줌HTTP 요청
↓
[Controller]
↓ (Service 주입)
[Service]
↓ (Repository 주입)
[Repository]
↓
DB 접근
@ComponentScan으로 Bean 탐색UserController가 UserService를 생성자 파라미터로 가지면UserService 객체를 찾아 주입UserService도 UserRepository가 필요하므로 마찬가지로 주입| 방식 | 설명 | 권장 여부 |
|---|---|---|
| 생성자 주입 | 생성자로 의존 객체를 받음 | ✅ 가장 권장 |
| 필드 주입 | @Autowired 필드에 직접 주입 | ❌ 지양 |
| 세터 주입 | @Autowired setter 메서드 이용 | 🔸 조건부 사용 (선택적 의존성에 적합) |