스프링 컨테이너 (Spring Container)

스프링 컨테이너 (Spring Container)

MemberServiceImpl의 생성자의 파라미터 0이 싱글빈일 것이 요구되는데, 2개의 후보가 있다고 합니다. 더 자세하게 살펴보기 위해 테스트로 핵심 에러 메시지를 뽑아보시면 다음과 같다. 정리하면 hello.core.member.MemberRepository의 후보로 AutoAppConfig의 memoryMemberRepository와 AppConfig의 memberRepository가 충돌되어 생겨나는 문제인 것을 알 있습니다.


Autowired를 통한 의존관계 자동 주입 시, 빈 선택 기준
Autowired를 통한 의존관계 자동 주입 시, 빈 선택 기준


Autowired를 통한 의존관계 자동 주입 시, 빈 선택 기준

@Autowired 에러 메시지를 보시면 MemberRpository 타입의 빈으로 하나 이상의 빈이 존재하여 자동 주입을 할 수 없습니다.고 합니다. Autowired는 다음과 같은 빈 선택 기준을 갖고 있습니다. 1. 타입에 해당하는 빈을 찾습니다. — 당연히 상속관계를 고려합니다. 즉 하위타입의 빈도 같이 검색됩니다. 2. 만약 1번의 결과가 유일하면 해당 빈을 주입합니다.

3. 그러나 1번의 결과가 2개 이상일 경우, 먼저는 후보들 중에서 Primary를 찾아서 있으면 해당 빈을 주입합니다. 4a. 없으면 후보들 중에서 이름을 기준으로 검색합니다. 검색할 이름의 기준은 다음과 같다. 기본으로 필드파라미터의 이름으로 검색합니다. Qualifier를 통해 각 필드파라미터 이름 대신 다른 이름을 검색할 있습니다.

문제 해결
문제 해결

문제 해결

위에서 언급했듯 MemberServiceImpl의 생성자 파라미터의 이름 문제인데, 이 이름을 repository에서 AutoAppConfig에서 선언한 빈을 사용할 수 있도록 memoryMemberRepository로 바꿔봅니다. 다음은 수정 후 스프링부트 앱을 실행해봅니다. 에러 없이 잘 출력되는 것을 볼 있습니다.