No qualifying bean of type 'hello.hellospring.repository.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,springDataJpaMemberRepository(draft)

개발새발·2022년 5월 14일
0

spring

목록 보기
3/26
post-custom-banner

spring 강의를 듣다가 자꾸 이상한 에러가 생겨서 찾아보게 됐는데, bean 등록 문제였다. 위 에러와 함께 Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memberService' defined in class path resource [hello/hellospring/SpringConfig.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=springConfig; factoryMethodName=memberService; 요 에러도 떴는데 비슷한 원인이라 함께 기록해본다.

  1. (아래 내용들은 추가로 코드들이 더 있지만 축약하겠다. )일단 아래처럼 코드가 되어있었는데, 타이틀로 둔 에러는 MemoryMemberRepository.java 여기에 @Repository 를 제거하니 에러가 사라졌다. member에 대한 저장소를 하나만 지정하여야 하는데, MemoryMemberRepository.javaSpringDataJpaRepository.java가 중복으로 빈이 등록되어 발생한 것이였다.

    SpringDataJpaMemberRepository.java

    public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    
        @Override
        Optional<Member> findByName(String name);
    }

    MemoryMemberRepository.java

    @Repository -> 지워주면 잘됨
    public class MemoryMemberRepository implements MemberRepository{
    
        private static Map<Long, Member> store = new HashMap<>();
        private static long sequence = 0L;
    
        @Override
        public Member save(Member member) {
            member.setId(++sequence);
            store.put(member.getId(), member);
            return member;
        }
    }

  1. (아래 내용들은 추가로 코드들이 더 있지만 축약하겠다.) 서두에 적은 에러 원인도 마찬가지인데, 설정 파일(SpringConfig)에서도 MemberService에 대한 빈등록을 하고, [MemberService.java](http://MemberService.java)에서도 @Service 어노테이션을 통해서 빈을 등록하였기때문에 동일한 빈 등록으로 인지하여 오류가 생긴 것이다. 따라서, MemberService.java@Service 를 지워주면 잘 동작하게 되었다.

    MemberService.java

    @Service -> 지워주면 잘됨
    public class MemberService {
    
         private final MemberRepository memberRepository;
    
         @Autowired
         public MemberService(MemberRepository memberRepository) {
                this.memberRepository = memberRepository;
         }
    }

    SpringConfig.java

    @Configuration
    public class SpringConfig {
    
        private final MemberRepository memberRepository;
    
        @Autowired
        public SpringConfig(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
    
            @Bean
        public MemberService memberService() {
            return new MemberService(memberRepository);
        }
    }
profile
발새발개
post-custom-banner

0개의 댓글