본문 바로가기
강의 정리/스프링 핵심 원리 - 기본편

4. 컴포넌트 스캔

by 이석준석이 2020. 12. 17.

1. 컴포넌트 스캔

 

@ComponentScan

  • @Component가 붙은 클래스를 빈으로 등록한다.
  • 아래의 코드처럼, @Component가 붙어있어도 제외할 수 있다.
    • Configuration 어노테이션이 붙은 것은 필터링해서 제외하라.
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)

 

@ComponentScan + @Autowired를 통해서 빈 등록과 의존관계 주입을 쉽게할 수 있다.

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    ...
}

 

등록되는 스프링 빈의 기본 이름은

  • 맨 앞글자만 소문자로 변경해서 빈으로 등록된다.
    • ex) MemberServiceImpl => memberServiceImpl

2. 컴포넌트 스캔 탐색 위치, 스캔 대상

 

1. 패키지 대상 스캔 (basePackages)

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

2. 클래스 대상 스캔 (basePackageClasses)

@ComponentScan(
        basePackageClasses = AutoAppConfig.class
)

 

패키지를 포함해서 하위 패키지를 모두 탐색한다.

  • 그냥 @ComponentScan만 있으면(default)
    • 현재 ComponentScan을 붙인 프로젝트에서, 하위 패키지를 모두 탐색한다.

자바에서 Annotation 간에 상속은 없다.

  • 이는 스프링에서 지원해주는 기능이다.

 

아래의 4가지 어노테이션은 모두 @Component 를 포함한다.

  • @Controller : 스프링 MVC 컨트롤러로 인식
  • @Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층 예외를 스프링 예외로 변환해준다.
  • @Configuration : 스프리 설정 정보로 인식하고, 빈이 싱글톤으로 유지하도록 처리해준다.
  • @Service : 별 기능은 없으나, 비즈니스 계층을 인식하는데 도움이 된다.

3. 중복 등록과 충돌

 

자동 빈 등록(@Component) vs 자동 빈 등록

  • 같은 이름의 빈이 두 번 등록되면 ConflictingBeanDefinitionException 발생

수동 빈 등록(@Bean) vs 자동 빈 등록

  • 같은 이름의 빈 (@Component, @Bean) 이 두 번 등록되면 오버라이딩된다.
    • 수동 등록된 빈(@Bean) 이 우선권을 갖는다.
  • 하지만 스프링부트(@SpringBootApplication)는 수동 vs 자동 빈 등록이어도, 에러가 나도록 만들었다.
    • 이를 허용하게 하려면
      • spring.main.allow-bean-definition-overriding=true 로 변경해야한다.

'강의 정리 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글

7. 빈 스코프  (0) 2020.12.24
6. 빈 생명주기 콜백  (0) 2020.12.23
3. 싱글톤 컨테이너  (0) 2020.12.15
2. 스프링 컨테이너와 스프링 빈  (0) 2020.12.13
1. 객체지향 설계와 스프링  (0) 2020.12.12