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

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

dasol199님의 프로필 이미지
dasol199

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 빈 2개 이상 등록됨 : expected single matching bean but found 2

해결된 질문

작성

·

1.3K

0

안녕하세요 스프링 입문 강의 수강 중 궁금한 점이 있어 질문 남깁니다.

Spring Data Jpa를 적용하면서 스프링이 JpaRepository를 가진 인터페이스의 구현체를 자동으로 생성하고 빈으로 등록한다는 것으로 이해했습니다.

따라서 기존의 Repository 클래스들의 @Repository 어노테이션과 @Service 어노테이션을 삭제 후 Configuration으로 직접 빈을 등록하도록 변경하였습니다.

자동 등록되는 어노테이션을 모두 제거하였고, Config 클래스의 memberRepository 빈 등록 부분도 주석처리 해주었으나 MemberRepositoryImpl이 빈으로 등록되어 다음과 같은 에러가 발생합니다.

MemberRepositoryImpl은 어디에서 빈으로 등록되는 건가요??

답변 1

1

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

강의에서는 MemberRepositoryImpl을 사용하지 않아 어떤 코드를 작성하셨는지 알 수 없습니다.

MemberRepositoryImpl을 지우고 확인해주세요
.
감사합니다.

dasol199님의 프로필 이미지
dasol199
질문자

강의의 MemoryMemberRepository가 MemberRepositoryImpl입니다

클래스를 지우고 문제를 해결할 수 있지만 어느부분에서 빈이 등록되는지 알고싶어 질문드립니다

강의 순서에 따라

MemoryMemberRepository, JdbcMemberRepository, JdbcTemplateMemberRepository, JpaRepository 순으로 구현체를 변경하였고

이때까지는 문제없이 하나의 빈만 등록되어 정상적으로 동작하는 것을 확인하였습니다.

SpringDataJpaMemberRepository를 Config 클래스에서

@Autowired
public SpringConfig(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
}

위와 같이 주입해준 결과 MemoryMemberRepository와 JpaRepository가 둘 다 등록되었습니다.

JpaRepository를 가지고 있는 SpringDataJpaMemberRepository가 자동으로 빈에 등록되는 것은 이해했으나

어디서 MemoryMemberRepository가 빈으로 등록되었는지 모르겠습니다

Config 클래스의 위 코드 제외한 Repository 빈 등록 코드와 각 Repository 클래스의 어노테이션도 삭제된 상태입니다.

 

MemoryMemberRepository, MemberRepositoryImpl에 자동 스프링 빈으로 등록하는 어노테이션을 선언하지 않았다면(@Repository, @Component 등)

스프링데이터JPA 진행중 발생한 상황이라면 아래와 같은 상황으로 보입니다.

영한님의 스프링데이터JPA 강의에서 설명해드리는 내용으로

사용자 정의 구현 클래스 규칙에 해당하여 스프링 빈으로 등록된 상황입니다.

image

imageJPA강의 -> 본 강의

MemberRepository(I) -> SpringDataJpaMemberRepository(I)

MemberRepositoryCustom(I) -> MemberRepository(I)

자세한 내용은 영한님의 스프링데이터JPA 강의 혹은 "사용자 정의 클래스 impl"로 검색하시면 많은 자료들을 확인하실 수 있으니 참고 부탁드립니다.

 

dasol199님의 프로필 이미지
dasol199

작성한 질문수

질문하기