Controller annotation @Controller
Controller annotation @Controller
@Controller 어노테이션을 쓰면
- 생성자가 없을 경우 기본 생성자를 사용하려 객체 생성을 대신 해준다.
- 생성자를 만들었다면 그걸 이용하려 객체 생성을 대신 해준다
1
2
3
4
5
6
7
8
@Controller
public class ToDoController {
private final ToDoRepository toDoRepository;
public ToDoController(ToDoRepository toDoRepository) {
this.toDoRepository = toDoRepository;
}
}
Spring이 @Controller를 보고 스프링 빈(Bean)으로 등록해서 DI 컨테이너가 객체를 생성한다
- 객체를 만드는 건 @Controller가 아니라 Spring IoC/DI 컨테이너다.
@Controller는 다음 역할을 한다:
- Spring이 이 클래스를 스캔해서 스프링 빈으로 등록
@Controller는 @Component의 특수화 어노테이션
Component Scan에 의해 Bean 등록
이때 객체 생성은 Spring IoC Container가 담당
- 컨트롤러 클래스를 Spring MVC 요청 처리 대상으로 등록
- URL 매핑(@RequestMapping, @GetMapping 등)을 활성화
- DispatcherServlet이 이 클래스를 핸들러로 인식
즉, @Controller는 “이 클래스가 컨트롤러 역할을 한다”는 표시 역할을 하는 것이다.
생성자 관련 정확한 동작
상황 1: 생성자 없음
- Spring이 기본 생성자로 객체를 생성 → Bean 등록
상황 2: 생성자 있음 (예: Repository 주입)
- Spring은 생성자에 필요한 타입의 Bean을 찾아서 자동 주입(Dependency Injection) → 그 생성자를 이용해서 객체를 만들고 등록
➡️ 생성자를 호출해서 객체 만드는 건 @Controller가 아니라 Spring Container임
“@Controller는 해당 클래스를 스프링 MVC의 컨트롤러로 등록하고, 스프링이 이 클래스를 Bean으로 만들도록 표시하는 어노테이션이다.”
“Bean 생성과 의존성 주입은 Spring IoC 컨테이너가 담당한다.”
➡️ 어노테이션은 객체를 생성하는 능력이 없다. 객체 생성은 항상 Spring IoC 컨테이너의 역할이다.
정리
@Controller의 정확한 역할
Spring Component Scan에 의해 Bean 등록 대상임을 표시
스프링 MVC 요청 매핑 대상 클래스임을 표시
DispatcherServlet이 이 클래스를 Handler로 인식하도록 함
객체 생성 주체
➡️ Spring IoC Container
생성자 주입이 되는 이유
➡️ Spring이 Bean 생성 시 생성자에 필요한 의존성을 자동으로 주입해주기 때문
This post is licensed under CC BY 4.0 by the author.