[스프링] @ComponentScan

손성우·2022년 2월 2일
0

스프링

목록 보기
6/9

@ComponentScan

@Component가 붙은 클래스들을 모두 스프링 빈으로 등록해준다.

  • 기본 빈 이름 : 클래스명을 사용하되 맨 앞글자를 소문자로
  • 빈 이름을 설정해주고 싶다면 @Component("memberService")식으로 하면 된다.
  • 모든 자바 클래스들을 컴포넌트 스캔하면 시간이 오래걸릴 수 있기 때문에 아래와 같이 스캔할 범위를 지정할 수 있다. 아래와 같이 설정하면 해당 패키지 포함 하위 패키지들로 제한된다.
@ComponentScan(
 basePackages = "hello.core",
}
  • 만약 범위를 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스를 시작 위치로 설정
    그리고 프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는 것이 좋다. 참고로 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication 를 이 프로젝트 시작 루트 위치에 두는 것이 관례이다. (그리고 이 설정안에 바로 @ComponentScan 이 들어있다.)

컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.
@Component : 컴포넌트 스캔에서 사용
@Controlller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용
@Repository : 스프링 데이터 접근 계층에서 사용
@Configuration : 스프링 설정 정보에서 사용

참고 : useDefaultFilters 옵션은 기본으로 켜져있는데, 이 옵션을 끄면 기본 스캔 대상들이 제외된다.

Filter(컴포넌트 스캔에서 포함 또는 제외할 수 있는 옵션)

@ComponentScan(
			// 포함
            includeFilters = @ComponentScan.Filter(classes = MyIncludeComponent.class),
            // 제외
            excludeFilters = @ComponentScan.Filter(classes = MyexcludeComponent.class)
    )

쓸 일은 거의 없다.(@Component면 충분하기 때문에, excludeFilters는 가끔)

중복 등록과 충돌

컴포넌트 스캔에서 같은 빈 이름이 중복 등록되는 경우
1. 자동 빈 vs 자동 빈
-> ConflictingBeanDefinitionException 예외 발생

  1. 수동 빈 vs 자동 빈
@Component
public class MemoryMemberRepository implements MemberRepository {}

@Configuration
@ComponentScan
public class AutoAppConfig {

   @Bean(name = "memoryMemberRepository")
   public MemberRepository memberRepository() {
   		return new MemoryMemberRepository();
 }
}

위에는 스프링이 클래스명의 앞글자를 소문자로 바꿔 자동으로 빈으로 등록 아래는 수동으로 빈으로 등록한 경우이다. 이럴 경우 수동 빈이 자동빈을 오버라이딩한다.

  • 로그

    Overriding bean definition for bean 'memoryMemberRepository' with a different
    definition: replacing

의도적으로 개발자가 설정한 경우도 있지만, 그렇지 않고 이런 설정들이 꼬이는 경우가 대부분이다. 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.

출처 : 김영한의 스프링 핵심 원리 - 기본편

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글