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