@Bean
과 같은 설정 정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.@Autowired
기능도 제공한다.main 폴더의 core 패키지 아래 AutoAppConfig 클래스를 생성한다.
<코드>
@ComponentScan
을 설정 정보에 붙여주면 된다.@Bean
없이도 스프링 빈으로 등록할 수 있다.@Component
애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.@Configuration
소스코드 안에도 @Component
애노테이션이 붙어있기 때문에 컴포넌트 스캔의 대상이다.@Component
애노테이션을 추가한다.@Autowired
애노테이션을 추가하여 자동 의존관계 주입을 한다.Test 폴더에 scan 패키지를 생성하고, AutoAppConfigTest 클래스를 생성한다.
<코드>
기존과 같이 잘 동작하는 것을 알 수 있다.
@ComponentScan
은 @Component
애노테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때, 스프링 빈의 이름은 클래스 명을 사용하되 맨 첫글자는 소문자로 사용한다.@AutoWired
애노테이션을 붙이면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입한다. 이때, 기본적으로 타입이 같은 빈을 찾아 주입한다. getBean(MemberRepository.class)
와 비슷한 방식이다.@ComponentScan
에서 탐색할 패키지의 시작 위치를 지정할 수 있다. 모든 자바 클래스를 스캔하지 않기 때문에 시간을 절약할 수 있다.
만약 지정하지 않는다면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
@ComponentScan(basePackages = "hello.core.member")
관례 및 권장: basePackages를 사용하지 않고, 설정 정보 클래스를 프로젝트 패키지 루트에 둔다. 실제로도 스프링 부트의 @SpringBootApplication
애노테에션도 @ComponentScan
를 포함하고 있기 때문에, 모든 컴포넌트를 자동으로 등록할 수 있는 것이다.
컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다. 해당 클래스의 소스 코드에 @Component
를 포함하고 있기 때문이다.
@Component
: 컴포넌트 스캔에서 사용@Controlller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비즈니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용@Configuration
: 스프링 설정 정보에서 사용<코드>들...
includeFilters
에 MyIncludeComponent 애노테이션을 추가해서 BeanA가 스프링 빈에 등록된다.excludeFilters
에 MyExcludeComponent 애노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.일반적으로 @Component
면 충분하기 때문에 필터 옵션은 자주 사용하지 않는다.
애노테이션에 대한 공부가 더 필요할 듯 하다 . . .
수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌하면 수동 빈이 자동 빈을 오버라딩하여 우선권을 가진다. 하지만 이러한 설정은 코드를 복잡하게 만들기 때문에 최신 스프링 부트에서는 오류를 발생기키도록 설정되어 있다.
본 포스팅은 김영한 강사의 스프링 핵심 원리 강의를 수강하고 요약한 것으로, 해당 강의의 영상 및 강의자료를 참고하였습니다.