본문 바로가기
개발자 공부 - 인프런 온라인 강의/스프링 핵심 원리 - 기본편

[섹션 6. 컴포넌트 스캔] 필터 / 인프런 김영한 스프링 핵심 원리 기본편

by easpop 2023. 5. 28.
728x90
반응형

이번 시간에는 ComponentScan의 필터에 대해서 알아보았다.

 

필터는 컴포넌트 스캔 대상을 추가로 지정하는 includeFilters와,

컴포넌트 스캔에서 제외할 대상을 지정하는 excludeFilters가 있다.

 

테스트를 위해 filter 패키지를 생성한다.

 

그리고 Annotation을 생성한다.

Component 소스코드에 들어가서 드래그 되어진 3줄을 복사해서 붙여넣는다.

MyIncludeComponent 가 붙은거는 컴포넌트 스캔 대상에 포함될 것이다.

마찬가지로 클래스를 복사해서 Exclude, 즉 컴포넌트 스캔의 대상에서 제외되는 클래스를 만들어준다.

 

클래스를 하나 만들고, 아까 만들었던 MyIncludeComponent 어노테이션을 달아준다.

 

마찬가지로 클래스를 복사하고, MyExcludeComponent 어노테이션을 달아준다.

 

그리고 테스트를 위한 클래스를 생성한다.

반응형

AppConfig를 생성해준다.

includeFilters는 @ComponentScan.Filter 로 지정해주고,

type을 FilterType.ANNOTATION 로 쓰게 되면 어노테이션과 관련된 필터를 만든다 는 뜻이 된다.

그리고 BeanA가 등록되었는지 테스트를 하는 코드를 작성해준다.

 

이렇게 되면 나만의 컴포넌트를 스캔할 수 있는 기능이 만들어진다.

 

테스트 결과 정상적으로 통과되었다.

includeFilters 에 MyIncludeComponent 어노테이션을 추가해서 BeanA가 스프링 빈에 등록되었고,

excludeFilters에 MyExcludeComponent 어노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.

 

FilterType에는 5가지 옵션이 있다.

 

ANNOTATION : 어노테이션을 인식해서 동작한다.

그리고 어노테이션은 기본값이기 때문에 빨간색 부분을 생략해도 정상적으로 동작한다.

ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다. (ex. org.example.SomeClass)

예를 들어서 BeanA도 빼고 싶다면 아래와 같이 하면 된다.

excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = BeanA.class)

 

ASPECTJ : AspectJ 패턴을 사용한다. (ex. org.example..*Service+)

REGEX : 정규식 표현식이다. (ex. org\.example\.Default.*)

CUSTOM : TypeFilter 라는 인터페이스를 구현해서 처리한다. (ex. org.example.MyTypeFilter)

 

참고로, @Component면 충분하고, includeFilters 는 거의 사용할 일이 없다고 한다.

excludeFilters 는 가끔 사용할 때가 있지만 많지는 않다.

그리고 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하기 때문에, 옵션을 변경하기 보다는

기본 설정에 최대한 맞추어서 하는 것을 권장한다고 한다.

728x90
반응형

댓글