Gidhub BE Developer

Spring 프레임워크 핵심 기술 - @Component와 Component Scan

2019-09-24
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

@Component

  • @Component 애노테이션을 사용하면

    Component Scan시

    해당 클래스 혹은 객체를 Bean으로 등록시켜준다.

  • 이 글에서는 Component Scan 시

    그 범위가 어떻게 되는지 알아보자.


Component Scan 범위

  • Spring Boot에서

    서버를 구동시키기 위한

    시작점은 일반적으로 다음과 같다.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
  • 위와 같은 상황에서

    다른 패키지에 있는 Bean을 주입받으려고 시도한다면

    Application에 속한 패키지가 아닌 영역이기 때문에 Bean 주입이 안된다.

@SpringBootApplication
public class Application {

    @Autowired
    private EventService eventService; // 다른 패키지의 Bean을 주입받으려고 시도

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

  • 물론 코드에서는 사용이 가능하지만

    다음과 같은 에러가 발생한다.

  • 즉 Component Scan은

    해당 패지키에 속해있는 Bean만 주입받을 수 있다.

  • 물론 Bean 등록을 따로하여

    다른 패키지에 Bean을 주입 받을 수 있다.


Component Scan 옵션

  • 다양한 옵션이 있지만

    그 중 Filter라는 옵션이 있다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    ...
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};
    ...
}
  • includeFilters는 Component Scan 시 해당 타입을 포함시킨다.

  • excludeFilters는 Component Scan 시 해당 타입을 제외시킨다.


  • 실제로 @SpringBootApplication의

    메타 애노테이션을 보면

    excludeFilters를 사용하는 것을 볼 수 있다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
        @Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), 
        @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})
        }
)
public @interface SpringBootApplication {
    ...
}

Summary

  • Component Scan의 영향 범위를

    제대로 인지하고 있어야 Bean 주입 이슈가 발생하면 정확하게 원인을 파악할 수 있다.


Reference


Comments

Index