Annotated Controllers

ppparkta·2025년 4월 22일
0

Spring

목록 보기
3/7

@Controller

컨트롤러 어노테이션은 컴포넌트 스캔이 가능한 빈 객체로 등록하는 어노테이션이다.

이와 동시에 일반적인 컴포넌트와는 다른 특별한 기능도 수행한다.

컴포넌트 스캔이란?

컴포넌트로 등록된 모든 객체를 스캔하여 스프링 내부에서 Bean으로 등록하여 싱글톤 객체로 만들어준다.

Spring Component Scanning | Baeldung

핸들러 매핑

RequestMappingHandlerMapping 구현체 까보면서 학습함

@Service에 대해 찾아보다가 @Service와 @Controller의 차이점에 대해 궁금해져서 두 어노테이션을 비교함.

  • @Controller 어노테이션은 프레젠테이션 계층이라는 의미를 부여할 수 있다.
  • @Service 어노테이션은 @Controller와 하는 역할은 비슷하나 서비스 계층(비즈니스 로직 계층)임을 명시할 수 있어서 객체에 눈에 보이는 의미를 부여할 수 있다.

기능적으로 보면 두 어노테이션 모두 스프링이 컴포넌트로 인식하고 빈으로 등록되지만, 스프링 MVC에서는 @Controller만 요청 핸들러로 인식되는 것 같음.

(요청 핸들러는 웹에 대한 요청을 처리하는 객체입니당)

  • @Controller → @Service 변경 시 코드가 의도대로 동작하지 않음.
  • @Service → @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);
	}
profile
겉촉속촉

0개의 댓글