on
ComponentScan의 Filter 설정하기
ComponentScan의 Filter 설정하기
728x90
스프링 프레임워크에서는 기본적으로 Component 어노테이션이 붙어있을 경우 이를 모두 Scan해서 스프링 컨테이너에 등록합니다.
그러나 개발을 진행하다보면, 수십 수백개의 스프링 설정정보(Bean 등)가 있을 경우 이를 모두 스캔하다보면 성능이 떨어질 수도 있고, 굳이 불 필요한 것들까지 스캔할 필요는 없겠죠.
그래서 스프링에서 제공하는 기능 중에 Filter라는 옵션이 있습니다.
말 그대로 필터링해서 특정 컴포넌트는 스캔하지 않도록 설정할 수 있는 옵션인데요, 개발자가 의도적으로 특정 클래스나 컴포넌트를 필터링하도록 설정할 수도 있습니다.
어노테이션 인터페이스 만들기
임의로 두 개의 인터페이스를 만들도록 하겠습니다. 하나는 컴포넌트 스캔 대상으로 지정할 인터페이스이고, 다른 하나는 컴포넌트 스캔 대상에서 제외할 인터페이스입니다.
컴포넌트 스캔 대상에 포함할 인터페이스
컴포넌트 스캔 대상에서 제외할 인터페이스
각 인터페이스 위에 달린 어노테이션들은 스프링에서 제공하는 Component 인터페이스에 설정된 어노테이션을 그대로 가져왔습니다.
이제 Bean 클래스를 두 개 만들어서 위의 인터페이스들을 하나씩 적용해보겠습니다.
컴포넌트 스캔 대상에 포함할 빈 컴포넌트 스캔 대상에서 제외할 빈
이렇게 설정한 정보를 활용해 테스트를 해보도록 하겠습니다.
테스트용 클래스를 하나 작성합니다. filterScan 메소드는 각각의 BeanA와 BeanB를 가져와서 BeanA는 isNotNull 메소드를 통해 값이 존재한다는 것을 증명하고, BeanB는 NoSuchBeanDefinitionException 예외를 던지도록 테스트코드를 작성합니다.
그리고 아래 쪽에 config 클래스를 하나 만들어줍니다.
여기서 주의깊게 살펴봐야할 것은 ComponentScan 입니다.
컴포넌트 스캔의 옵션으로 includeFilters에는 저희가 포함되도록 만들어놓은 MyIncludeComponent의 클래스를 가져와서 해당 클래스는 컴포넌트 스캔을 하겠다!라고 의사표시를 해줍니다.
아래쪽 excludeFilters 옵션은 컴포넌트 스캔 대상에서 제외하겠다는 옵션으로, 기존에 만들어둔 MyExcludeComponent의 클래스를 옵션에 적용합니다.
이제 위의 테스트를 돌려보면 테스트가 통과해야합니다.
왜냐하면 MyIncludeComponent를 적용한 BeanA는 컴포넌트 스캔 대상이므로, null 값이 아니어야 하는게 맞고, MyExcludeComponent를 적용한 BeanB는 스프링 컨테이너에 등록되지 않기 때문에 '그런 빈은 존재하지 않는다.' 라는 NoSuchBeanDefinitionException 을 뿌려주는게 정상적인 로직의 결과이기 때문이죠.
테스트를 돌려보면,
정상적으로 테스트가 통과한 것을 알 수 있습니다.
정리
스프링의 @ComponentScan 옵션으로 includeFilters 와 excludeFilters가 있으며, 전자는 컴포넌트 스캔 대상에 포함할 것들, 후자는 대상에서 제외할 것들을 지정한다.
스프링을 개발할 때 스캔해야할 컴포넌트에는 어노테이션으로 @Component를 지정하기 때문에, includeFilters를 사용할 일은 거의 없다. excludeFilters는 필요에 따라 사용할 경우도 생긴다.
from http://ip323.tistory.com/41 by ccl(A) rewrite - 2021-12-19 12:02:10