작성
·
146
1
안녕하세요 강의 잘 듣고 있습니다.
다름이아니라 @Configuration Class에서 Bean을 구성할 때는
@Bean
public Interface interface(){
return new {구현체};
}
와 같은 방식으로 interface의 구현체를 선택하는 것으로 알고있습니다. 그래서 위의 코드에서 {구현체} 부분만 {바뀐구현체}로 바꾸면 어플리케이션 전반에서 바뀐 구현체를 사용하게 되는 것으로 이해했습니다.
다름이아니라 componentscan시에는구현체의 변경을 어떻게 해줘야하는지에 대해 제가 이해한게 맞나 궁금합니다.
인터페이스: DiscountPolicy
>>>구현체1: RateDiscountPolicy
>>>구현체2: FixDiscountPolicy
위와 같이 있다고 하면, @Component를 RateDiscountPolicy와 FixDiscountPolicy 둘 중 어느한쪽에만 달아주는 것으로 구현체를 지정한다고 생각하면 되나요?
답변 1
0
저도 강의를 보다가 작성자님께서 지적하신 부분이 너무 궁금했어요.
그런데 곰곰이 생각해보니까, 처음에 @Component가 붙은 FixDiscountPolicy를 사용하다가 @Component가 붙은 RateDiscountPolicy를 추가로 만들었다고 했을 때 나중에 스프링 설정 클래스(@Configuration가 있는 클래스)에서 excludeFilters 속성을 사용하여 배제 시키면 구현체가 변경되는 결과를 얻을 수 있잖아요? 그러면 개발자 입장에서는 일단 구현체에 @Component를 때려 박아서 개발하다가 변경되어 제외해야 할 클래스가 있다면 스프링 설정 클래스의 @ComponentScan에서 클래스명으로 배제시키는 것이 편한 것 같아요. 기존의 @Bean을 사용한 방식이 "포함할 구현체"에 초점이 맞추어졌다면 @Component를 사용한 방식은 "배제할 구현체"에 초점이 맞추어져 있지 않나라는 생각이 드네요.
혹시 이와 관련해서 제가 잘 이해하고 있는지 추가적으로 답변이 있으면 좋겠네요 ㅠㅠ
참고로, 양쪽 구현체에 @Component가 붙은 상태에서 필터로 FixDiscountPolicy를 배제하지 않고 테스트 실행해보면 다음과 같은 오류가 뜨네요.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\ ~경로~ \OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy, rateDiscountPolicy
오류문을 보면 대략 "OderServiceImpl.class에서 DiscountPolicy타입을 사용하는데 이 인터페이스 밑으로 구현체가 2개 있어서 어느 쪽으로 연결해야 할 지 모르겠어"라는 뜻이네요.