인프런 김영한 강사님의 스프링 핵심 원리 - 기본편 sec06
출처 : 스프링 핵심원리 - 기본편
스프링 빈에 일일히 @Bean을 붙이는 것은 굉장히 귀찮기도 하지만, 오류가 발생할 가능성 상승
해결 방법 : 컴포넌트 스캔, @Autowired
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
모든 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸림 => 꼭 필요한 위치부터 탐색하도록 시작 위치 지정
설정 정보 클래스의 위치를 프로젝트 최상단에 두자!
=> 프로젝트의 모든 패키지들이 자동으로 컴포넌트 스캔의 대상이 됨
@Component : 컴포넌트 스캔에서 사용
@Controller : 스프링 MVC 컨트롤러에서 사용 / 스프링 MVC 컨트롤러로 인식
@Service : 스프링 비즈니스 로직에서 사용 / 핵심 비즈니스 로직이 여기에 있겠구나 라고 비즈니스 계층을 인식하는데 도움이 됨
@Repository : 스프링 데이터 접근 계층에서 사용 / 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해줌
@Configuration : 스프링 설정 정보에서 사용 / 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리함
includeFilters : 컴포넌트 스캔 대상을 추가로 지정
excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정
@Test
void filterScan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
BeanA beanA = ac.getBean("beanA", BeanA.class);
assertThat(beanA).isNotNull();
Assertions.assertThrows(
NoSuchBeanDefinitionException.class,
() -> ac.getBean("beanB", BeanB.class));
}
@Configuration
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {
}
같은 빈 이름이 등록되어 충돌이 되는 경우가 있다.
1. 자동 빈 등록 VS 자동 빈 등록
-> ConflictBeanDefinitionException
예외 발생
2. 수동 빈 등록 VS 자동 빈 등록
-> 수동 빈 등록이 우선권을 가짐
스프링에서 이가 오버라딩 되었다고 알려주지만, 의도를 가지고 하지 않는 이상 최대한 안 하는 것이 좋음