참고 DI와 제어의 역전 : https://velog.io/@sago_mungcci/DI%EC%99%80-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84%EC%9D%B4%EB%9E%80
DI 를 사용하기 위해서는 객체 생성이 우선 되어야 했다. 과연 어디서 객체 생성을 해야 할까? 바로 스프링 프레임워크가 필요한 객체를 생성하여 관리하는 역할을 대신해 준다.
즉 Bean은 의존성 주입을 실행하는 프레임워크가 의존성 주입에 해당하는 객체를 지정하는 것이고 이 지정한 bean을 ioc컨테이너에 넣어서 필요할때 객체를 만들어서 실행시켜준다.
따라서 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙으면 bean을 주입해서 ioc컨테이너에 넣고 스프링이 실행될때 ioc컨테이너에 등록된 bean을 조회해서 의존성 주입을 해주는 것이다.
스프링 빈과 ioc컨테이너 예시
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
}
참고로 @Component는 위와 같이 ElementType.TYPE 설정이 있으므로 Class 혹은 Interface에만 붙일 수 있다.
컴포넌트 스캔의 대상
@Component 외에 @Controller, @Service, @Repository, @Configuration는 @Component의 상속을 받고 있으므로 모두 컴포넌트 스캔의 대상이다.
@Controller
스프링 MVC 컨트롤러로 인식된다.
@Repository
스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다.
@Service
특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다.
@Configuration
스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다. (물론 스프링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않음.)