티스토리 뷰
컴포넌트 스캔과 의존관계 자동 주입
이전까지 스프링 빈을 등록하려 했다 - @Bean을 통해 설정 정보에 직접 등록
스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan 기능을 제공한다.
컴포넌트 스캔은 @Component이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
+) @Configuration이 붙은 설정 정보도 자동 등록이 됨, 충돌을 조심하자
단, 스프링 빈 이름은 클래스 이름의 첫 문자를 소문자로 변경하여 사용한다. ( AddPrice -> addPrice )
또한, 의존관계를 자동으로 주입해주는 @Autowired 기능도 제공한다.
디폴트는 스프링 컨테이너가 타입이 같은 빈을 찾아서 주입한다.
컴포넌트 스캔의 탐색 위치와 기본 스캔 대상
컴포넌트 스캔의 대상을 직접 설정할 수 있다.
basePackages("패키지 이름") 을 통해 시작 위치를 정할 수 있다. 대상은 패키지의 하위 폴더들이다.
지정하지 않는다면? @Component가 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다
--> 설정 정보 클래스를 프로젝트의 최상단에 두는 것을 권장
+) 스프링 부트의 시작 정보인 @SpringBootApplication은 시작 루트 위에 둔다. 위의 이유 때문에
컴포넌트 스캔의 스캔 대상은 @Component 만 있는 것이 아니다.
@Controller - 스프링 MVC 컨트롤러로 인식
@Service - 스프링 비즈니스 로직에서 사용
@Repository - 스프링 데이터 접근 계층에서 사용
@Configuration - 스프링 설정 정보 인식, 스프링 빈 싱글톤 유지 처리
이 애노테이션들은 @Component를 상속받은 것이 아닌, 스프링이 이 관계를 지원해주는 것이다.
필터
컴포넌트 스캔에 추가, 제외할 대상을 지정하는 명령어
includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.
중복 등록과 충돌
컴포넌트 스캔을 통해 같은 빈 이름이 등록된다면?
자동으로 등록되는 경우 스프링이 오류를 발생시킨다. -> ConflictingBeanDefinitionException 예외 발생
수동 빈 등록과 자동 빈 등록되는 경우에는? -> 수동 빈이 우선권을 가진다 ( 수동 빈이 자동 빈을 오버라이딩 )
하지만 두 등록 방법을 혼용하다 오류가 발생하면 잡기 어려운 버그가 생긴다고 함..
이를 위해 스프링 부트에서는 두 등록이 충동하면 오류를 발생하도록 기본 값을 수정 했다고 한다.
본 포스팅은 인프런 강의 김영한님의
[ 스프링 핵심 원리 - 기본편 ] 을 수강하며 작성한 내용입니다.