You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
컴포넌트 스캔을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록되기 때문에,
AppConfig, TestConfig 등 앞서 만들어두었던 설정 정보도 함께 등록되고, 실행되어 버린다. 그래서
excludeFilters 를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외했다. 보통 설정 정보를 컴포넌트
스캔 대상에서 제외하지는 않지만, 기존 예제 코드를 최대한 남기고 유지하기 위해서 이 방법을 선택했다
컴포넌트 스캔은 이름 그대로 @component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다
각 클래스에 @component 애노테이션을 붙여주자
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
섹션 6. 컴포넌트 스캔
1. 컴포넌트 스캔과 의존관계 자동 주입 시작하기
등록해야 하는 빈이 수십 수백개가 된다면 일일이 등록하기가 힘들어 진다.
컴포넌트 스캔 : 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 스프링 기능
@Autowired : 의존관계 자동 주입
AutoAppConfig
@ComponentScan을 설정 정보에 붙여주면 된다@Bean으로 등록한 클래스가 하나도 없다컴포넌트 스캔은 이름 그대로 @component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다
각 클래스에 @component 애노테이션을 붙여주자
2. 탐색 위치와 기본 스캔 대상
모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸리므로 꼭 필요한 위치부터 탐색하도록 시작
위치를 지정할 수 있다
basePackages: 탐색할 패키지의 시작 위치 지정, 이 패키지를 포함해서 하위 패키지를 모두 탐색한다basePackages = {"hello.core", "hello.service"}여러 시작 위치 지정 가능.basePackageClasses: 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.@ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.권장하는 방법
패키지 위치를 지정하지 말고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 방법
예를 들어, 아래 같은 프로젝트 구조일때
com.hello에 AppConfig 같은 메인 설정 정보를 둔다.@ComponentScan애노테이션을 붙이고, basePackages 지정은 생략한다.com.hello를 포함한 하위는 모두 자동으로 컴포넌트 스캔의 대상이 된다.@SpringBootApplication을 이 프로젝트 시작 루트 위치에 두는 것이 관례이다.컴포넌트 스캔 기본 대상
3. 필터
includeFilters
컴포넌트 스캔 대상을 추가로 지정
excludeFilters
컴포넌트 스캔 제외 대상 지정
컴포넌트 스캔 대상에 추가할 클래스
컴포넌트 스캔 대상에 제외할 클래스
전체 테스트 코드
FilterType
5가지 옵션
ex) org.example.SomeAnnotation
ex) org.example.SomeClass
ex) org.example..*Service+
ex) org.example.Default.*
ex) org.example.MyTypeFilter
4. 중복 등록과 충돌
컴포넌트 스캔에서 같은 빈 이름을 등록하면?
1) 자동 빈 등록 vs 자동 빈 등록
스프링이 오류를 발생시킨다
ConflictingBeanDefinitionException 예외 발생
2) 수동 빈 등록 vs 자동 빈 등록
수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 한다)
최근 스프링 부트는 수동 빈과 자동 빈이 충돌하면 오류가 나도록 설정
All reactions