[Spring 기본] 5. 컴포넌트 스캔

heyhey·2023년 2월 2일
0

Spring

목록 보기
14/23

지금까지 스프링빈을 등록할때는 @Bean 을 이용해 설정 정보에 직접 등록하였다.

여러개의 빈을 등록하기 귀찮기 때문에 스프링은 자동으로 등록해주는 컴포넌트 스캔이라는 기능을 제공한다.

@Autowired 자동으로 의존관계가 주입되는 기능도 있다.

사용법

새로운 AppConfig파일을 만들어준다.

@Configuration
@ComponentScan(
  basePackages = "hello.core",
  excludeFilters = @ComponentScan.Filter(
    type= FilterType.ANNOTATION,
    classes = Configuration.class
  )
)
public class AutoAppConfig {}

(내용이 없어도 상관없다.)

컴포넌트 스캔을 사용하기 위해서 @ComponentScan 을 설정 정보 앞에 붙여주면 된다.
그럼 컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록해준다.

  • @Controller , @Service, @Repository 들도 코드를 열어보면 @Component가 포함된다.
  • 모든 파일? 에 @Component 를 붙여주자

ComponentScan을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록이 된다.
우리는 앞서 AppConfig파일을 만들었었기 때문에 이러한 정보들을 제외하기 위해서 excludeFilters로 제외시켰다.

@ComponentScan

@ComponentScan@Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.

  • 이 때, 스프링 빈의 기본 이름은 클래스명이 소문자가 되어 사용되어진다.

@Autowired

의존 관계 자동 주입
생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
생성자에 파라미터가 여러개 존재해도 자동으로 찾아서 주입한다.

탐색 위치

@ComponentScan(
  basePackages = "hello.core",
)

탐색할 위치를 지정할 수 있다. {"hello.core", "hello.service"} 형태로 여러개로도 지정할 수 있지만,
굳이 패키지 위치를 지정하기 않고 최상단에 두는 것이 일반적이다.
=> 하위는 모두 자동으로 컴포넌트 스캔의 대상이 되기 때문이다.

스프링 부트를 사용하면 @SpringBootApplication 가 생성되는데 이 설정안에 @ComponentScan가 들어있다.

@Component : 컴포넌트 스캔에서 사용
@Controlller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용

  • 사실 @Service는 특별한 처리는 없지만, 관례적으로 사용된다.
    @Repository : 스프링 데이터 접근 계층에서 사용
    @Configuration : 스프링 설정 정보에서 사용

includeFilters

컴포넌트 스캔 대상을 추가로 지정한다.

excludeFilters

컴포넌트 스캔 대상에서 제외할 대상을 지정한다.

애노테이션 만들기

위의 내용을 실험하기 위해서 애노테이션을 만들어준다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent { 
}
@Configuration
@ComponentScan(
  includeFilters = @ComponentScan.Filter(
    type = FilterType.ANNOTATION, 
    classes = MyIncludeComponent.class
  ),
  excludeFilters = @ComponentScan.Filter(classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {}

includeFilters 를 이용해서 MyIncludeComponent를 등록하고
excludeFilters 를 이용해 MyExcludeComponent 를 스프링 빈에 등록되지 않는다.

@Component 를 이용하면 includeFilters는 사용하는 일이 거의 없다.
excludeFilters 도 자주 사용되지는 않는다

profile
주경야독

0개의 댓글