녕의 학습 기록

[Spring 기본] 컴포넌트 스캔 (1) 본문

Dev/Spring

[Spring 기본] 컴포넌트 스캔 (1)

kjyyjk 2022. 11. 10. 23:57

 학습 내용 

컴포넌트 스캔 및 의존관계 자동 주입


* 컴포넌트 스캔

 

여태까지 스프링 컨테이너에 빈을 등록하기 위해서는 설정 정보에 @Bean을 이용

 

만약 스프링 빈으로 등록할 게 수천 수만가지라면 ?

 

컴포넌트 스캔( @ComponentScan ) 을 이용하면 더 간단하게 빈 등록할 수 있다.

 

설정 정보에 @ComponentScan을 붙이고 Bean으로 등록할 클래스 앞에 @Component를 붙여준다

 

그러면 @ComponeneScan에서 @Component 을 스캔 후 빈으로 등록한다.

 

설정 정보에 @ComponentScan / 내용은 비어있다

기본적으로 @Configuration 도 내부적으로 @Component를 포함하고 있기 때문에 탐색 조건에 해당한다

앞서 만들었던 설정 정보(수동 Bean 등록)랑 겹치면 안되니까 스캔 대상에서 제외했다.

 

클래스 앞에 @Component

* 의존관계 자동 주입

 

기존 설정 정보에서는 등록할 Bean을 나열하면서 의존 관계도 나타내주었지만,

 

컴포넌트 스캔을 한 뒤로 의존 관계에 대한 내용을 어디서도 찾아 볼 수가 없다.

 

@Autowired 를 이용해 의존관계를 자동으로 주입해준다

 

생성자 앞에 @Autowired 애너테이션

@Autowired 사용하면 생성자에서 여러 의존관계 한번에 주입 받을 수 있다.

 

파라미터 속 타입(MemberRepository.class, DiscountPolicy.class)에 맞는 Bean찾아 의존관계 자동 주입

 

마치 ac.getBean(MemberRepository.class) 과 비슷하다

 

컴포넌트 스캔과 의존관계 자동 주입이 잘 작동하는지 테스트

컴포넌트 스캔과 의존관계 자동 주입으로 MemoryMemberRepository에 의존하는 MemberService 가 Bean으로 등록?

실행결과 : 성공

 

+ 로그를 통해서도 컴포넌트 스캔이 작동되는 것을 확인 가능하다

 

* 컴포넌트 스캔 및 의존관계 자동 주입 정리

 

@ComponentScan

 

- @ Component 붙은 클래스 모두 스프링 빈 등록(싱글톤)

 

- 빈 이름은 클래스명에서 소문자 앞글자 / @Component( "이름" ) 통해 임의로 이름 지정도 가능하다

 

@Autowired

 

- 생성자에 지정하면 스프링 컨테이너가 자동으로 스프링 빈 찾아 주입

 

- 타입이 같은 빈을 찾아 주입

만약 타입이 같은 빈이 두개 이상이라면..? (뒤에서 학습)

 

 

* 컴포넌트 탐색 위치

 

모든 자바 클래스를 다 스캔하기에는 시간 효율 x

 

필요한 위치를 탐색 스캔한다

 

- basePackages : 탐색 시작할 패키지를 지정 / 해당 패키지를 포함하여 하위 패키지 탐색

 

- basePackageClasses : 지정한 클래스의 패키지부터 탐색 시작

 

디폴트 : @ComponentScan 붙은 클래스의 패키지부터 시작

 

ex) 

hello.core 패키지부터 탐색 시작. core 하위 패키지도 전부 탐색

 

! 프로젝트 시작 루트( ex) hello.core )에 메인 설정정보 ( ex) AppConfig ) 를 두고 @ComponentScan 붙이고

 따로 지정 x 를 김영한님은 권장하는 바 !

→ hello.core 포함 하위 모두가 컴포넌트 스캔의 대상

 

* 컴포넌트 스캔 대상

 

사실 컴포넌트 스캔은 오직 @Component만 스캔하는 것이 아니다.

like 앞에서 @Configuration도 스캔하여 Bean등록

 

@Component / @Controller / @Service / @Repository / @Configuration 을 스캔 대상으로 한다.

 

실제로 해당 애노테이션 들어가서 코드 보면 모두가 내부적으로 @Component 포함하고 있다

 

+ 해당 애노테이션들을 통해 스프링은 추가적인 기능을 수행한다

 


 다음 학습 내용 

 

컴포넌트 스캔 필터 및 Bean 중복 등록

 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com