@Component, @ComponentScan
기존에 스프링 컨테이너에 빈을 등록하는 방법은 AppConfig에 @Bean 어노테이션을 작성하는 것이었다. 만약 등록해야 하는 빈이 수백 개라면? 설정 정보를 수백 개 작성해야 한다. 반복 작업은 실수가 생길 수 있고 하기 싫다 일단. 스프링은 오래 사용된 친절한 기술이므로 당연히 다른 방법이 있다. 빈에 등록하고 싶은 클래스에 @Component 어노테이션을 작성해준다. 그 다음 @Configuration을 작성한 클래스에 @ComponentScan을 작성한다. 끝이다. (?) @ComponentScan이 뜻대로 Component들을 scan하여 컨테이너에 빈으로 등록해준다. 빈에 등록할 때 해당 클래스의 이름을 가져와 빈의 이름으로 등록하는데 이때 첫 글자는 소문자로 변환한다.
@Component
public class OrderServiceImpl inplements OrderService{
//blah blah code code
}
위의 경우는 orderServiceImpl로 빈에 등록된다. 따로 이름을 설정하고 싶으면 @Component("Teho")와 같이 작성하면 된다.
(궁금해서 돌려봤는데 이때는 첫글자도 대문자 그대로 Teho로 등록된다.)
@ComponentScan에도 몇가지 설정 정보가 있다.
@ComponentScan(
basePackages = "hello.core"
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class),
includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class)
)
public class AutoAppConfig {
}
(AutoAppConfig 안에 코드를 하나도 작성하지 않은 게 보인다.... 간편 단순해졌다.)
basePackages : ComponentScan을 할 위치를 설정한다. 해당 설정 값의 경로를 시작으로 해당 하위 파일들을 스캔한다. 안 해두면 쓸데없이 모든 java 파일을 스캔하게 된다. default 값이 존재하는데 @ComponentScan이 적힌 클래스의 패키지가 시작 위치이다. 그래서 관례적으로 프로젝트의 최상단에 configuration 파일을 둔다. (basePackagesClasses는 지정한 클래스의 패키지를 시작 위치로 설정한다.)
excludeFilters, includeFilters : ComponentScan을 제외하거나 예외적으로 포함하는 설정을 할 수 있다.
(자주 안쓸 것 같으니 필요하면 구글링 해서 사용하고 이런 기능이 있다 정도로 알아 둘 거다 나는..)
어 근데 이러면 의존관계 주입은 어케하지????
@AutoWired
의존 관계 주입을 자동으로 해준다. 생성자 위에 @Autowired를 작성해주면 된다.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
스프링 컨테이너가 알아서 MemberRepository, DiscountPolicy 타입의 빈을 찾아서 주입해준다.
(뒤의 강의를 살짝 봤는데 생성자가 하나일 경우 @Autowired를 작성해주지 않아도 스프링이 알아서 해준다.)
@Bean vs @Component
@Bean(수동 등록) @Component(자동 등록)을 모두 사용해서 같은 이름의 빈이 컨테이너에 등록되면 수동 등록이 우선 순위를 인정받아 적용된다. 이 상황이 의도해서 덮어쓴 경우라면 문제가 없지만 그렇지 않을 경우 오류를 찾기 힘들 수 있다. 그래서 스프링 부트에서는 이 경우를 오류로 받아들여 충돌로 인지한다.
'Spring' 카테고리의 다른 글
[Spring] @Qualifier, @Primary & 빈 생명주기 콜백 (2) | 2022.08.06 |
---|---|
[Spring] 의존관계 자동 주입 방법 & 옵션 처리 & LOMBOK(롬복) (0) | 2022.08.01 |
[Spring] 싱글톤 컨테이너 (1) | 2022.07.23 |
[Spring] 스프링 컨테이너 & 스프링 빈 조회 (3) | 2022.07.20 |
[Spring] AppConfig (0) | 2022.07.16 |