인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

조재연님의 프로필 이미지
조재연

작성한 질문수

스프링 핵심 원리 - 기본편

컴포넌트 스캔과 의존관계 자동 주입 시작하기

안녕하세요 강사님 질문이있습니다.

작성

·

3.4K

1

12:48 처럼 AutoAppConfig 테스트를 해보았는데요.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file : Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 3: memoryMemberRepository,memberRepository1,memberRepository2

이러한 에러가 발생하는데요. 찾아보니

@Autowired 사용시에는 동일한 타입을 Bean 객체를 2개사용하지 말것. 이라고 나와있더라구요.

그래서 어디쪽을 살펴보면 좋을까요..? 

답변 2

4

제 생각에는 AutoAppConfig 파일이 어떤 디렉터리 안에 있는지 확인해보세요!

hello.core 밑에 있는건지, hello.core.member 폴더에 있는지요


만약 hello.core.member 밑이면 hello.core로 옮기시구요!

조재연님의 프로필 이미지
조재연
질문자

안녕하세요. 제가 강의 자료 보면서 다시 하니까 중간에 빼먹고 안한게 있더라구요. 그거 때문에 안된거 같습니다 ! 중간에 제 노트로 정리하면서 빼먹었나 봅니다...

답변 감사합니다 !

2

안녕하세요. 조재연님, 공식 서포터즈 OMG입니다.

조재연님이 작성한 코드를 봐야 알겠지만 우선,

======

12:48 처럼 AutoAppConfig 테스트를 해보았는데요.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file : Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 3: memoryMemberRepository,memberRepository1,memberRepository2

======

올려주신 에러는

컴포넌트 스캔과 의존관계 자동 주입 시작하기 (4분~

에러와 동일한 것으로 보입니다. 해당 Config파일은 SameBeanConfig인데 AutoAppConfig에서도 동일한 에러가 출력되는 것으로 보아 해당 부분에 문제가 있는 것 같습니다.

해당 테스트코드와 MemberRepository, MemberRepositoryImpl, Config 클래스에 대해서 메뉴얼과 비교해보신 후 확인해봐도 해결이 어려울 경우 아래 링크를 참고하여 전체 프로젝트 코드를 공유해주세요.  

https://blog.naver.com/aufcl856/221818787116

감사합니다.

조재연님의 프로필 이미지
조재연
질문자

감사합니다! 해결했습니다.~

해결되었다니 다행입니다

어떤 문제였었는지 공유해주실수 있을까요~?^^

조재연님의 프로필 이미지
조재연
질문자

넵! 저 같은 경우는 MemberRepository, MemberRepositoryImpl, Config 클래스 를 다시 확인해봤는데 똑같더라구요.. 그래서 ApplicationContextSameBeanFindTest 이 테스트 파일을 다시 작성했더니 해결되었습니다..(?)

근데 이렇게 작성이 되있는데 No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy <- 이 에러가 발생하더라구요.

그래서 구글링 해보니까 다른분들도 비슷한 에러가 발생되고 조회 대상 빈이 2개 이상일 때 해결방법 3가지가 소개되있긴 하는데 그건 이 다음 챕터에 바로 소개가 되는데 강사님 자료에는 잘 나온다고 되어있어서 다시 코드 체크중입니다. ㅜ

@Component
public class RateDiscountPolicy implements DiscountPolicy

@Component
public class FixDiscountPolicy implements DiscountPolicy


@Component
public class OrderServiceImpl implements OrderService {

private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}

아 그렇군요 ㅎㅎ

공유해주셔서 감사해요~!!

늦었지만 덧글 달아드립니다. AppConfig에서는 DisCountPolicy로 무엇을 사용할지 fixed or rate로 지정했었는데 AutoAppConfig로 넘어오게 되면서 그냥 단순히 DiscountPolicy에게 Autowired하면 무엇을 넣을지 spring이 알지 못하게 된겁니다. 오류도 그래서 NoUniqueBeanDefinition입니다. 따라서 fix 나 rate중에 하나만 Componentscan을 하면 정상 동작합니다.

조재연님의 프로필 이미지
조재연
질문자

그렇군여 상세한 설명 감사합니다

조재연님의 프로필 이미지
조재연

작성한 질문수

질문하기