컨트롤러 어노테이션은 컴포넌트 스캔이 가능한 빈 객체로 등록하는 어노테이션이다.
이와 동시에 일반적인 컴포넌트와는 다른 특별한 기능도 수행한다.
컴포넌트로 등록된 모든 객체를 스캔하여 스프링 내부에서 Bean으로 등록하여 싱글톤 객체로 만들어준다.
Spring Component Scanning | Baeldung
RequestMappingHandlerMapping 구현체 까보면서 학습함
@Service에 대해 찾아보다가 @Service와 @Controller의 차이점에 대해 궁금해져서 두 어노테이션을 비교함.
기능적으로 보면 두 어노테이션 모두 스프링이 컴포넌트로 인식하고 빈으로 등록되지만, 스프링 MVC에서는 @Controller
만 요청 핸들러로 인식되는 것 같음.
(요청 핸들러는 웹에 대한 요청을 처리하는 객체입니당)
이로 추측해보면 @Controller는 내부에서 @RequestMapping과 함께 웹 계층에 대한 추가적인 처리를 하고, 그 외는 일반적인 컴포넌트의 역할과 동일한 것
RequestMappingHandlerMapping
클래스 내부에 다음과 같은 구분이 있는데 추측해보건데 요청에 대해 HandlerMapping이 컨트롤러만을 필터링하기 때문에 컨트롤러 이외의 컴포넌트는 컨트롤러의 역할을 수행하지 못하는 것 같음.
요청 보내고 중단점 찍었을 때 해당 객체가 실행되는 것으로 보아 가능성 높음
/**
* {@inheritDoc}
* <p>Expects a handler to have a type-level @{@link Controller} annotation.
*/
@Override
protected boolean isHandler(Class<?> beanType) {
return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class);
}