java.lang.IllegalStateException: Failed to load ApplicationContext
Parameter 0 of constructor in hello.hellospring.SpringConfig required a single bean, but 2 were found:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.hellospring.repository.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,springDataJpaMemberRepository
가장 첫번째로 배운 Repository클래스인 memoryMemberRepository클래스의 어노테이션 @Repository를 계속 붙여놓으니까 이것도 컨테이너에 추가된듯..?? 그냥 @Repository 주석처리하니까 됐음..
근데 이전의 JpaRepository나 JdbcRepository클래스 쓸 때는 왜 됐었던건지 모르겠음
아마 springDataJpaMemberRepository가 인터페이스라서 그런 것 같음
-> @Bean에서 이미 Repository 의존성 주입을 해서 어노테이션 @Repository를 무시한 것 같다..
그래서 Repository용 @Bean이 전부 주석 처리 되었을 때
memberRepository를 spring이 알아서 가져오는데
예전 예제의 memoryMemberRepository클래스의 어노테이션 @Repository를 안지워주면
인터페이스 JpaRepository와 같이 처리되는 것 같다.. 하 솔직히 좀 헷갈린다
SpringDataJpaMemberRepository는 강의에서 설명드리는 것 처럼 스프링이 자동으로 스프링 빈으로 등록해줍니다.
코드를 보면 MemberRepository를 Bean으로 등록한 부분은 없습니다.
대신에 MemberRepository를 스프링으로 부터 주입 받아서 사용하는 부분이 있습니다.
동일한 타입의 빈이 중복 등록되어 발생한 문제가 맞습니다.