
@Controller, @Service, @Repository, @Configuration은 모두 @Component가 붙어있다.
어노테이션은 기본적으로 메타정보를 나타내기 때문에 자체적으로 특정 기능이 있지는 않다. 또 상속과 같은 개념이 있는 것도 아니다.
스프링에서는 컴포넌트 스캔을 통해 @Component가 붙어있는 클래스들을 스캔해서 빈으로 등록하는데 이때, @Component를 가지고 있는 @Controller, @Service, @Repository, @Configuration 이 4가지 어노테이션이 붙어있는 클래스들도 빈으로 등록한다. 어노테이션은 상속을 지원하지 않기 때문에, 이런 처리는 자바가 아닌 스프링에서 해주는 것이다.
스프링에서는 각 어노테이션에 맞게 빈 등록 이외에 추가적인 처리를 지원한다.
해당 클래스를 스프링 MVC 모듈의 컨트롤러로 인식하게 해준다.
이 어노테이션은 특별한 처리를 해주는 것은 아니지만, 개발자들에게 명시적으로 비즈니스 로직을 처리하는 클래스하는 것을 보여준다.
해당 클래스를 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 한 단계 추상화하여 스프링 예외로 변환시켜 던져준다. (스프링의 DataAccessException) 이로 인해 db마다 다른 예외가 일어나도 서비스 단에 영향을 끼치지 않게 된다.
해당 클래스를 스프링 설정 정보로 인식한다. 또한 cglib을 통해 조작된 클래스가 빈으로 등록되게 하며, 이로 인해 빈들을 싱글톤으로 관리할 수 있다.