본문 바로가기
Spring

[스프링 핵심 원리 - 기본편] 필터

by 박성민 2021. 9. 19.
  • includeFilters: 컴포넌트 스캔 대상을 추가로 지정합니다.
  • excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정합니다.

설정 정보와 전체 테스트 코드

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
        BeanA beanA = ac.getBean("beanA", BeanA.class);
        assertThat(beanA).isNotNull();

        assertThrows(
                NoSuchBeanDefinitionException.class,
                () -> ac.getBean("beanB", BeanB.class));
    }

    @Configuration
    @ComponentScan(
            includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
            excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
    )
    static class ComponentFilterAppConfig {

    }

}
  • inlcudeFiltersMyIncludeComponent 애노테이션을 추가해서 BeanA가 스프링 빈에 등록됩니다.
  • excludeFiltersMyExcludeComponent 애노테이션을 추가해서 BeanB가 스프링 빈에 등록되지 않습니다.

FilterType 옵션

FilterType은 5가지 옵션이 있습니다.

  • ANNOTATION: 기본값, 애노테이션을 인식해서 작동합니다.
    • ex) org.example.SomeAnnotation
  • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작합니다.
    • ex) org.example.SomeClass
  • ASPECTJ: AspectJ 패턴 사용
    • ex) org.example..*Service+
  • REGEX: 정규 표현식
    • ex) org\.example\.Default.*
  • CUSTOM: TypeFilter이라는 인터페이스를 구현해서 처리
    • ex) org.example.MyTypeFilter

BeanA도 빼고 싶은 경우

@ComponentScan(
  includeFilters = {
    @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
  },
  excludeFilters = {
    @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class),
    @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = BeanA.class)
  }
)

참고: @Component면 충분하기 때문에, inlcudeFilters를 사용할 일은 거의 없습니다. excludeFilters는 여러가지 이유로 간혹 사용될 때가 있지만 많지는 않습니다.
특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 옵션을 변경하면서 사용하기보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장합니다.

참조

댓글