@ComponentScan의 옵션

namkun·2022년 3월 12일
0

Spring

목록 보기
8/18

해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.


스캔 위치지정

지금이야 간단한 프로젝트에서 구성을 하니 당연히 Component 를 스캔하는데 얼마 걸리지 않겠지만, 실무에서는 다르다.

그렇기에 우리는 우리가 필요한 부분만 스캔하도록 하는 basePackages 또는 basePackageClasses 옵션을 이용해서 좀 더 빠르게 스캔하도록 할 수 있다.

  • basePackages : 스캔할 패키지의 위치를 지정한다. 지정할때 값은 String 값으로 입력해주면 된다.
    • basePackages = "com.core.carTest"
  • basePackageClasses : 지정한 클래스의 패키지를 스캔할 위치로 지정한다.
    • basePackagesClasses = AutoApplicationConfiguration.class

만약 아무것도 지정하지 않는다면?

default는 @ComponentScan이 붙은 configuration 클래스의 패키지가 시작 위치가 된다.

왠만하면 기본 설정에 따르는 것이 제일 좋다!

컴포넌트 스캔 기본 대상

저번에 말했던 유의점이다. 다음과 같은 어노테이션은 @Component 어노테이션을 기본으로 포함한다.

  • @Controller
  • @Service
  • @Repository
  • @Configuration

참고1 : '상속'이 아니라 '포함' 이라고 한 이유는 어노테이션 간에는 상속관계라는 것이 없기 때문이다. 그렇기에 특정 어노테이션을 통해서 다른 어노테이션을 인식하는 것은 자바의 기능이 아닌 스프링의 기능이다.

참고2 : 추가로 저위의 언급된 어노테이션들은 다음과 같은 기능을 동시에 수행한다.

  • @Controller : Spring MVC 컨트롤러로의 인식
  • @Service : 그냥...아무처리 안함, 이게 서비스구나...라고 사람이 인식?
  • @Repository : Spring 데이터 접근 계층으로 인식, 데이터 계층의 예외들을 모두 추상화되어있는 스프링 예외로 변경
  • @Configuration : Spring 설정 정보로의 인식, 스프링 빈이 싱글톤을 유지할 수 있도록 추가 처리

Filter

  • includeFilters : componentScan에서 추가할 대상
  • excludeFilters : componentScan에서 제외할 대상

사용하는 방법은 다음과 같다.(include나 exclude나 사용방법은 동일하다.)

@ComponentScan(
        excludeFilters = {
                @ComponentScan.Filter(type = FilterType.REGEX, pattern = "hello\\.core\\.carTest\\..*"),
                @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) // 기존에 만든 다른 configuration 클래스들이 빈으로 등록되는 것을 막기 위해서 제외시킨다.
        })

type에 따라서 정규표현식을 , 어노테이션을 필터로 쓸 수도 있다.

해당 FilterType 옵션은 다음과 같다.

  • ANNOTATION : 기본값, 어노테이션을 인식해서 동작
  • ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작
  • ASPECTJ : AspectJ 패턴 사용
  • REGEX : 정규 표현식
  • CUSTOM : TypeFileter라는 인터페이스를 구현해서 처리
profile
개발하는 중국학과 사람

0개의 댓글