Domain/Spring

[Spring] Component와 ComponentScan ( Component / SpringBootApplication / Bean )

by Donghwan 2021. 9. 12.

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 ... } ) } )

  • FilterType.ANNOTATION
  • FilterType.ASPECTJ
  • FilterType.ASSIGNABLE_TYPE
  • FilterType.REGEX
  • FilterType.CUSTOM
includeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에 추가할 수 있습니다. @Filter 어노테이션에 FilterType과 어노테이션, 정규식, AspectJ 패턴 등을 활용하여 추가할 대상을 지정할 수 있습니다.

@ComponentScan(excludeFilters = { @Filter(type = FilterType, classes = { 클래스1, 클래스2 ... } ) } )

  • FilterType.ANNOTATION
  • FilterType.ASPECTJ
  • FilterType.ASSIGNABLE_TYPE
  • FilterType.REGEX
  • FilterType.CUSTOM
excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있습니다. @Filter 어노테이션에 FilterType과 어노테이션, 정규식, AspectJ 패턴 등을 활용하여 제외할 대상을 지정할 수 있습니다.

 

ComponentScan 충돌

ComponentScan 기능을 사용해서 자동으로 빈을 등록할 때에는 충돌에 주의해야 합니다. 크게 빈 이름 충돌과 수동 등록에 따른 충돌이 발생할 수 있습니다.

 

빈 이름 충돌

동일한 빈 이름이 존재하는 상태에서 ComponentScan하게 되면 ConflictingBeanDefinitionException이 발생하게 됩니다. 이러한 경우는 둘 중 하나에 명시적으로 빈 이름을 지정해서 이름 충돌을 피해야 합니다.

 

수동 등록한 빈과 충돌

스캔한 때 용하는 빈 이름과 수동 등록한 빈 이름이 같은 경우 수동 등록한 빈이 우선권을 가집니다.

 


참고자료

 

728x90
반응형

댓글