1. 컴포넌트 스캔과 의존관계 자동 주입
1-1 컴포넌트 스캔
- 컴포넌트 스캔 : 설정 정보 없이 자동으로 스프링 빈을 등록하는 기능
- @Autowired : 의존 관계를 자동으로 주입해주는 Annotation
- 아래 코드로 컴포넌트 스캔의 예시를 보자
@Configuration
@ComponentScan(
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
Configuration.class))
public class AutoAppConfig {
}
- 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan을 설정 정보 클래스에 붙여준다.
- excludeFilters : 컴포넌트 스캔을 사용하면 @Configuration이 붙은 설정 정보도 자동으로 스프링 빈에 등록되기 때문에 제외할 정보를 명시할 수 있다.
- 컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔하여 스프링 빈으로 등록한다.
- 이에 대한 예시를 아래 그림을 통해서 좀 더 자세히 알아보자
- 컴포넌트 스캔이 클래스를 스프링 빈으로 등록할 때, 기본 이름은 클래스명을 사용하되 앞 글자만 소문자를 사용한다.
- 물론 스프링 빈의 이름을 직접 지정할 수 있다. -> @Component("memberService2")
1-2 @Autowired 의존 관계 자동 주입
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. (생성자 주입)
- 이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.
1-3 컴포넌트 스캔의 탐색 위치와 기본 스캔 대상
- 컴포넌트 스캔은 필요한 위치부터 탐색하도록 시작 위치를 지정해줄 수 있다.
@ComponentScan(
basePackages = "hello.core",
}
- basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함하여 하위 패키지들을 모두 탐색한다.
- basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
- 만약 아무것도 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
- 컴포넌트 스캔의 기본 대상은 다음과 같다.
1) @Component : 컴포넌트 스캔에서 사용
2) @Controller : 스프링 MVC 컨트롤러에서 사용
3) @Service : 스프링 비즈니스 로직에서 사용
4) @Repository : 스프링 데이터 접근 계층에서 사용
5) @Configuration : 스프링 설정 정보에서 사용
1-4 필터
- IncludeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.
* 컴포넌트 스캔 대상을 추가할 클래스
@MyIncludeComponent
public class BeanA {
}
* 컴포넌트 스캔 대상에서 제외할 클래스
@MyExcludeComponent
public class BeanB {
}
* 적용
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
2. 중복 등록과 충돌
- 스프링 빈을 등록할 때 같은 이름으로 등록하는 실수가 종종 생긴다. 이때 경우는 보통 2가지로 나눌 수 있다.
1. 자동 빈 등록 vs 자동 빈 등록
2. 수동 빈 등록 vs 자동 빈 등록
2-1 자동 빈 등록 vs 자동 빈 등록
- 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은경우 스프링 빈은 ConflictingBeanDefinitionException 예외를 발생시킨다.
2-2 수동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌한다면 수동 빈이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 한다.)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
본 포스팅은 인프런의 '스프링 핵심 원리 - 기본편 : 김영한 강사님'의 강의와 자료를 참고하였습니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------