- 지금까지 스프링 빈(Bean)을 등록할 때 구성파일에
@Bean
을 사용했다
--> 관리할 빈이 많아지면 관리하기 번거로워 진다- 굳이 빈 설정파일을 만들지 않거나,
@Bean
을 안쓰고 빈 등록을 할 수 있다
-->@Component
과Component Scan
를 사용하면!
- 설정파일이 없다면 의존관계는 어떻게 주입할까?
-->@Autowired
를 사용해 자동 의존관계 주입을 한다
[ 정의 ]
:
@Component
를 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정
( 빈 설정파일 +@Bean
을 통해 빈을 하나하나 지정할 필요가 없음)
[ 특징 ]
- 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이
빈 이름
이 된다
ex)MemberServiceImpl
-->memberServiceImpl
- 빈 이름을 수동으로 지정 :
@Component("지정할 이름")
- 기본적인 컴포넌트 스캔 대상
@Component
: 컴포넌트 스캔에서 사용@Controller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비즈니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용@Configuration
: 스프링 설정 정보에서 사용
- 컴포넌트 스캔 범위
@ComponentScan
어노테이션이 있는 파일의 패키지 아래를 찾는다.basePackages
/basePackageClasses
로 지정도 가능- 권장 방법 : 구성파일에 등록시 프로젝트 최상단에 두기
(SpringBoot 사용시라면@SpringBootApplication
에 포함되어있어서 자동으로 최상단으로 유지된다)
[ 주의할 점 ]
DiscountPolicy
라는 인터페이스를 상속받는RateDiscountpolicy
와FixDiscountpolicy
가 있을 때 둘 중 내가 사용할 것만 빈에 등록해야 하기 때문에 한 곳에만@Component
를 붙여야함!
--> 아니면@Qulifier
이나,@Primary
를 사용해야 한다!
- 수동 빈 등록 vs 자동 빈 등록
: 자동으로 빈을 등록 한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는
수동 빈 파일이 우선권을 가진다. 하지만, 최근 SpringBoot는 오류를 낸다!
[ 옵션 ]
- 특정 어노테이션을 포함 / 제외 시킬 수 있음
- includeFilters : 컴포넌트 스캔 대상으로 추가
- excludeFilters : 컴포넌트 스캔 대상에서 제외
- FilterType 옵션
ANNOTATION
: 기본값, 어노테이션을 인식해 동작ASSIGNABLE_TYPE
: 지정한 타입과 자식 타입을 인식해 동작ASPECTJ
: AspectJ 패턴 사용REGEX
: 정규 표현식CUSTOM
: TypeFilter이라는 인터페이스를 구현해서 처리
[ 정리 ]
- 사실 어노테이션을 건드릴 일은 많지 않음 (존재하는 어노테이션이 충분해서)
- 가끔 특정 어노테이션을 제외하게 할 수 있음
- 기본 설정에 최대한 맞추어 사용하는 것이 관례
[ 정의 ]
의존관계 주입을 스프링 컨테이너에 등록된 빈(Bean)에서 찾아서 설정하는 방법
[ 설명 ]
- 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요함
-->@Autowired
를 사용하면 된다.
- 의존성 주입이 필요한 파일의 생성자에서 어노테이션 사용
- 더욱 더 자세한 내용은 다음 글에서 계속!
[ 원리 ]
1) 스프링 컨테이너가
@Component
를 찾아 모두 스프링 빈으로 등록!
2) 의존성이 필요한 부분에서@Autowired
태그가 있다면 등록된 스프링 빈에서 찾아서 의존관계 주입 설정!