컴포넌트 스캔 대상을 추가 또는 제외하는 방법

woply·2022년 1월 19일
0

TIL(Today I Learn)

목록 보기
20/31

📖 ✏️

  1. TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
  2. 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.

컴포넌트 스캔 대상을 추가 또는 제외하는 방법

컴포넌트 스캔 방식을 사용할 때, includeFiltersexcludeFilters를 이용하여 컴포넌트 스캔 대상을 추가하거나 제외할 수 있다. 주로 @Component만 사용하는 경우가 많지만, 간혹 excludeFilters를 사용하는 경우가 발생한다.

  • includeFilters: 컴포넌트 스캔 대상을 추가로 지정한다.
  • excludeFilters: 컴포넌트 스캔 제외 대상을 지정한다.

Filter 사용 방법

컴포넌트 스캔의 추가, 제외 테스트를 통해 Filter 사용 방법을 확인해 보자.

테스트 코드는 includeFilters를 이용하여, beanA를 컴포넌트 스캔에 포함하였다. 그리고 excludeFilters를 이용하여 beanB를 컴포넌트 스캔에서 제외하였다.

테스트 결과를 통해 포함 필터가 적용된 BeanAisNotNull()을 통과하며, 제외 필터가 적용된 BeanBNoSuchBeanDefinitionException 발생 조건을 통과하는 것을 확인 할 수 있다.

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

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
        BeanA beanA = ac.getBean("beanA", BeanA.class);
        Assertions.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 {
    }
}

컴포넌트 스캔 대상에 추가할 애노테이션

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {

}

컴포넌트 스캔 대상에서 제외할 애노테이션

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}

컴포넌트 스캔 대상에 추가할 클래스

@MyIncludeComponent
public class BeanA {
}

컴포넌트 스캔 대상에서 제외할 클래스

@MyExcludeComponent
public class BeanB {
}

FilterType의 옵션 사용 방법

FilterType은 5가지 옵션이 있다.

ANNOTATION: 기본값이므로, 아래와 같이 지정하지 않아도 애노테이션을 인식하여 동작한다.

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

ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다. 클래스를 직접 지정하는 방식이다

ASPECTJ: AspectJ 패턴 사용

REGEX: 정규 표현식

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


요약

  • includeFilters: 컴포넌트 스캔 대상을 추가로 지정한다.
  • excludeFilters: 컴포넌트 스캔 제외 대상을 지정한다.
profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글