Component?
@Component는 개발자가 직접 작성한 Class를 Bean으로 등록할 수 있도록 해주는 어노테이션입니다.
ComponentScan?
@ComponentScan은 스프링 3.1부터 도입된 어노테이션입니다. ComponentScan은 스프링이 직접 클래스를 검색해서 Bean으로 등록해주는 기능입니다. 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 설정 코드가 크게 줄어듭니다. 스프링이 검색해서 빈으로 등록할 수 있으려면 @Component 어노테이션을 붙여야 합니다. @Component 어노테이션은 해당 클래스를 스캔 대상으로 표시합니다.
@ComponentScan("패키지 경로")해당 패키지에 있는 컴포넌트 객체(@Component, @Controller, @Service, @Repository)들이 DI 컨테이너에 등록됩니다. 프로젝트의 규모가 커지고 패키지가 많아지면, 단순히 패키지 경로만으론 컴포넌트들을 원하는대로 불러오기는 어려울 것 입니다. |
@ComponentScan(basePackages = {"패키지 경로"})basePackages는 패키지 경로에 대한 설정입니다. 해당 경로를 포함하는 하위 패키지를 모두 스캔합니다. basePackages 는 런타임시에 체크가능합니다. |
@ComponentScan(basePackageClasses = 클래스이름.class)basePackageClasses는 스캔을 시작할 클래스를 지정하는 방식입니다. basePackageClasses는 컴파일시에 체크가 가능하고 별도의 루트 클래스가 있어야 합니다. |
@ComponentScan(useDefaultFilter = true or false)기본 제공하는 Filter를 사용할 것인지 설정하는 옵션입니다. 기본적으로 true입니다. |
@ComponentScan(includeFilters = { @Filter(type = FilterType, classes = { 클래스1, 클래스2 ... } ) } )
|
@ComponentScan(excludeFilters = { @Filter(type = FilterType, classes = { 클래스1, 클래스2 ... } ) } )
|
ComponentScan 충돌
ComponentScan 기능을 사용해서 자동으로 빈을 등록할 때에는 충돌에 주의해야 합니다. 크게 빈 이름 충돌과 수동 등록에 따른 충돌이 발생할 수 있습니다.
빈 이름 충돌
동일한 빈 이름이 존재하는 상태에서 ComponentScan하게 되면 ConflictingBeanDefinitionException이 발생하게 됩니다. 이러한 경우는 둘 중 하나에 명시적으로 빈 이름을 지정해서 이름 충돌을 피해야 합니다.
수동 등록한 빈과 충돌
스캔한 때 용하는 빈 이름과 수동 등록한 빈 이름이 같은 경우 수동 등록한 빈이 우선권을 가집니다.
참고자료
728x90
반응형
'Domain > Spring' 카테고리의 다른 글
[Spring] Spring MVC ( DispatcherServlet / HandlerMapping / HandlerAdapter / ViewResolver / View ) (0) | 2021.09.18 |
---|---|
[Spring] Servlet과 Servlet Container (0) | 2021.09.18 |
[Spring] 의존성 주입의 방식 ( Autowired / Inject / Resource / Bean / DI / Constructor / Setter / Field / 순환참조 ) (0) | 2021.09.10 |
[Spring] DTO vs VO vs Entity (0) | 2021.08.31 |
[Spring] JDBC와 Transaction (0) | 2021.08.18 |
댓글