Spring/Spring Core

필터

민철킹 2021. 3. 15. 16:08

includeFilters : 컴포넌트 스캔 대상을 추가로 지정

excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정

 

 

 

먼저, 애노테이션을 만들어보자.

클래스 타입에 붙는 애노테이션이라는 의미이다.

@MyIncludeComponent가 붙으면 컴포넌트 스캔에 추가

@MyExcludeComponent가 붙으면 컴포넌트 스캔에서 제외

하도록 만들어보려한다.

 

 

 

컴포넌트 대상으로 추가할 BeanA

 

컴포넌트 대상에서 제외할 BeanB

 

 

 

Config설정 클래스에서 Filter를 만들어 Test하기

includeFilters를 사용하여 Filter타입은 ANNOTATION으로, MyIncludeComponent 애노테이션이 붙은 클래스들은 컴포넌트 대상에 추가

excludeFilters를 사용하여 Filter타입은 ANNOTATION으로, MyExcludeComponent 애노테이션이 붙은 클래스들은 컴포넌트 대상에서 제외

 

이제 테스트 코드를 작성하는데, 먼저 컴포넌트 스캔 대상인 beanA를 조회한다. 이는 빈으로 등록되기 때문에 Null이 아니므로 테스트에 성공할 것이다.

 

 

 

우리가 제외시킨 beanB를 조회하면 어떻게 될까?

그런 이름의 빈은 없다는 NoSuchBeanDefinitionException이 발생한다. (왜냐 없으니까)

테스트를 성공시키기 위해 assertThrows를 통해 예외처리

 

테스트 성공!

 

 

FilterType 옵션

1. ANNOTATION : 기본값, 애노테이션을 인식해서 동작

  • ex) org.example.SomeAnnotation

2. ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작

  • ex) org.example.SomeClass

3. ASPECTJ : AspectJ 패턴 사용

  • ex) org.example..*Service+

4. REGEX : 정규 표현식

  • ex) org\.example\.Default.*

5. CUSTOM : TypeFilter 라는 인터페이스를 구현해서 처리

  • ex) org.example.MyTypeFilter

 

 

예를 들어서 BeanA도 제외하고 싶으면 다음과 같이 추가하면 된다.

ASSIGNABLE_TYPE을 사용하여 직접 클래스를 지정

 

 

@Component면 충분하기 때문에, includeFilter를 사용할 일은 거의 없다. excludeFilters는 여러가지 이유로 간혹 사용할 때가 있지만 많지는 않다.

특히 스프링 부트는 최근 컴포넌트 스캔을 기본으로 제공하는데, 옵션을 변경하면서 사용하기 보다는 스프링의 default설정에 최대한 맞추어 사용하는 것을 권장한다.

반응형

'Spring > Spring Core' 카테고리의 다른 글

다양한 의존관계 주입 방법  (0) 2021.03.17
중복 등록과 충돌  (0) 2021.03.15
탐색 위치와 기본 스캔 대상  (0) 2021.03.13
컴포넌트 스캔과 의존관계 자동 주입  (0) 2021.03.13
@Configuration  (0) 2021.03.12