컴포넌트 스캔

  • 등록해야 하는 @Bean이 많아지면 프로그래머는 굉장히 힘들것이다. 누락될 수도 있고
  • 자동으로 @Bean을 등록해주는 @ComponentScan 기능이 있다. 이런 경우 보통 클래스를 @Component으로 등록하고 각 메소드에 대한 의존관계를 위해 @Autowired를 등록해준다. 
  • @ComponentScan을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록된다. 그래서 이러한 의존관계 중 일부를 제외하고 싶다면 excludFilters를 사용해서 컴포넌트 스캔 대상에서 제외시킨다. 
  • @ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다
  • package hello.core;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import static org.springframework.context.annotation.ComponentScan.*;
    @Configuration
    @ComponentScan(
     excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
    Configuration.class))
    public class AutoAppConfig {
    
    }
  •  

김영한님의 스프링 핵심 강의

  • basePackages를 설정하면 packages의 위치부터 ComponentScan 하라는 의미이다. 이 basePackages를 등록하지 않으면 자바 전체 코드를 보기 때문에 시간이 오래 걸린다.
  • basePackages를 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스가 패키지 시작 위치가 된다. 
  • 보통 @SpringBootApplication 안에 @ComponentScan 이 붙어 있기 때문에 프로젝트 루트 위치에 두는것을 권장한다고 한다. 
  • 아래의 어노테이션들은 Java에서 지원하는 내용은 아니고 Spring에서 지원한다.
  • 컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.
    @Component : 컴포넌트 스캔에서 사용
    @Controlller : 스프링 MVC 컨트롤러에서 사용
    @Service : 스프링 비즈니스 로직에서 사용
    @Repository : 스프링 데이터 접근 계층에서 사용
    @Configuration : 스프링 설정 정보에서 사용
  • @interface를 통해서 어노테이션을 생성할 수 있다. 

ComponentScan 시 같은 빈 이름 등록은 어떻게 처리할까?

  • 자동으로 등록할 수 있다. 그런데 ConflictingBeanDefinitionException 에러를 뿜게 된다. 
  • 수동 빈과 자동 빈을 등록할 때 프로퍼티에 설정값을 추가해줘야 한다. 
  • 아래의 경우는 빈을 수동 등록한 코드이다. 같은 빈 이름이 이미 Spring Container에 존재한다면 설정값에 spring.main.allow-bean-definition-overriding=true 을 추가해줘야 수동빈을 오버라이딩하여 처리할 수 있다. 
  • @Configuration
    @ComponentScan(
     excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
    Configuration.class)
    )
    public class AutoAppConfig {
     @Bean(name = "memoryMemberRepository")
     public MemberRepository memberRepository() {
     return new MemoryMemberRepository();
     }
    }

'Spring' 카테고리의 다른 글

빈 생명주기 & 콜백  (0) 2021.12.14
의존관계 자동 주입  (0) 2021.12.13
싱글톤 컨테이너  (0) 2021.12.12
객체 지향 원리 적용  (0) 2021.12.10
Spring 예제  (0) 2021.12.10