Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'JPQLMemberRepository' defined in file [/Repository/JPQLMemberRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManager' available: expected single matching bean but found 2: getEm,org.springframework.orm.jpa.SharedEntityManagerCreator#0

해결 과정.

1) IoC컨테이너에서 EntityManagerFactory, EntityManager를 따로 빈 등록하는 것이 아닌 하나의 함수에 묶어서 빈 등록

2) 레포지토리에서는 엔티티 매니저만 주입을 받음

3) 테스트코드에서는 레포지토리만 주입 받음

 

 

 

위의 과정 중 발생한 오류

 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'xik.ShoppingMall.Repository.JPQLMemberRepositoryTest': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'xik.ShoppingMall.Repository.MemberRepository' available: expected single matching bean but found 2: JPQLMemberRepository,memberRepository

 

 

 

오류 키워드

1) NoUniqueBeanDefinitionException

2) available: expected single matching bean but found 2: JPQLMemberRepository,memberRepository

 

해당 키워드를 생각해보면 MemberRepository 두 개가 빈 등록 되어있어서 발생하는 오류임을 알 수 있습니다.

 

 

해결방법

: 기존에는 IoC컨테이너에서도 레포지토리를 빈 등록해주고, 레포지토리 클래스에서 @Repository를 해서 두번 빈 등록 해주고 있었습니다.

  - JPQLMemberRepository 에서 @Repository 할 꺼면 컨테이너에 레포지토리에 대한 빈 등록은 필요가 없습니다.

  - IoC컨테이너를 쓰려면 @Repository는 필요가없습니다.

  - 만약 두 군대에 레포지토리 등록을 사용하고 싶다면 JPQLMemberRepository 에 @Primary 를 붙쳐주면 해결됩니다.

 

 

* 빈 등록에 대해 숙지가 제대로 안된 상태라서 발생한 문제였습니다.

  빈 등록에 대해서 아래 주소에 블로깅해놨습니다.

 

https://tjdwns4537.tistory.com/70

 

Bean 등록 방법

 

tjdwns4537.tistory.com

 

 

 

 

 

 

+ Recent posts