작성
·
239
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
[소스코드]
https://drive.google.com/drive/folders/12UKQ6SBa5fZeSdpWkr36EDpLkZtXad4t?usp=sharing
강의를 듣는데 @Autowired 어노테이션에서 같은 타입이 2개이상 조회된 경우 필드명을 동일하게 해주면 해당 필드명에 맞는 빈을 주입한다고 했는데 빈이 적용되지 않는 오류가 납니다.. ㅠㅠ 테스트 코드를 아무리 돌려봐도 안되네요. 도와주세요!
또한 rateDiscountPolicy로 바꿔도 강사님과는 다르게 전체 테스트를 돌려보았을 때 xml은 성공적으로 수행하는 모습입니다. 이것도 왜 그런지 잘 모르겠습니다.
앞전 강의에서 전체 테스트를 돌렸을 때 CoreApplicationTests 에서 에러가 났는데, 여기서도 에러가 해결되지 않아 CoreApplication에 컴포넌트 스캔 및 excludeFilters 를 달아서 해결하였는데 이것도 왜 안되었던건지 궁금합니다.!!
전체 테스트를 돌렸을 때 총 3개가 에러가 나는데 basicSacn 뿐 아니라 나머지 2개가 왜 에러나는지도 해결 부탁드리고 싶습니다!
답변 1
1
안녕하세요. H N님
1. xml 오류
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository" />
<constructor-arg name="discountPolicy" ref="discountPolicy" />
</bean>
문제가 되는 코드
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy fixDiscountPolicy) {
super();
this.memberRepository = memberRepository;
this.discountPolicy = fixDiscountPolicy;
}
해결 방안
fixDiscountPolicy -> discountPolicy로 수정해야 합니다.
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy discountPolicy) {
super();
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
2. 이렇게 하면 그 다음으로 createUsingSpring 오류가 발생합니다.
오류 메시지: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
TestConfig를 보면 컴포넌트 스캔을 하고 있는데요. 두 빈을 모두 스캔합니다. 따라서 생성자 주입에서 DiscountPolicy를 결정을 할 수 없습니다.
이 경우 이름을 맞추거나 또는 하나를 @Primary로 지정하시면 됩니다.
예를 들어서 다음과 같이 적용하면 됩니다.
@Primary //적용
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
이렇게 하시면 모든 테스트가 통과할거에요.
감사합니다.
안녕하세요. H N님
Q: orderServiceImpl 생성자에서 파라미터를 fixDiscountPolicy 로 바꾸어도 xml 테스트에서는 오류가 나지 않는다는 것이었습니다. 원래는 오류가 나야할 것 같은데 말이죠.
-> 제 PC에서 올려주신 코드를 그대로 실행하면 xmlAppContext에서 오류가 발생합니다.
이 부분에서 확인이 필요할 것 같아요.
프로젝트를 다시 import 해서 실행해보시겠어요?
제가 말씀드린 내용에 오해가 있는 거 같아 다시 질문드립니다.
위와 같이 실행할 때 테스트가 다 통과하긴 합니다만 제가 궁금한 점은 다음과 같습니다.
orderServiceImpl 생성자에서 파라미터를
fixDiscountPolicy
로 바꾸어도 xml 테스트에서는 오류가 나지 않는다는 것이었습니다. 원래는 오류가 나야할 것 같은데 말이죠.createUsingSpring 테스트에서는 컴포넌트 스캔으로 테스트 한 것으로 강사님 말씀대로면
@Autowired
어노테이션이 붙었을 때 동작 방식에 따라 여러 빈이 겹칠 경우 그 후 순위로 파라미터 인자와 빈의 이름이 동일한 경우 빈이 주입된다고 들었습니다. 근데 fixDiscountPolicy, rateDiscountPolicy 인자로 바꾸어 보아도 모두 작동하지 않습니다. 아래와 같은 결과가 나오네요.위와 동일한 캡처 내용으로
AutoAppConfigTest.basicScan()
,CoreApplicationTestscontextLoads()
테스트도 작동하지 않습니다.정리하면
@Autowired 강의에서 말씀하신 동작방식이 먹지 않음
OrderserviceImpl 생성자 자동주입에 파라미터명을 바꿔도 XML 오류가 나지 않음
감사합니다.