강의

멘토링

로드맵

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

수빈님의 프로필 이미지
수빈

작성한 질문수

@coreApplicationTests 오류 (수동빈/자동빈 중복 오류)

작성

·

142

0

NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository

 

UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [C:\Users\soobi\Documents\study-springBoot\core\core\out\production\classes\hello\core\member\MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository

이 두가지 오류가 뜨는데 강의해주실때 이렇게 configuration.class 를 제외시키면서

auto가 아닌 그냥 수동으로 빈을 등록하는 Appconfig는 제외가 되야하는게 맞는게 이렇게 빈이 중복됐다고 나오는 이유를 알수가 없습니다. ㅜㅜ

coreApp에서 난 이러한 오류 해결방법을 알려주시면 감사하겠습니다.

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

//    @Bean(name = "memoryMemberRepository")
//    MemberRepository memberRepository() {
//        return new MemoryMemberRepository();
//    }

}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
수빈님께서 겪으신 오류는 MemberRepository 타입의 빈이 두 개(memoryMemberRepository, memberRepository) 있으면서, 스프링이 자동으로 의존성을 주입할 대상 빈을 하나만 찾으려고 했을 때 발생한 것으로 보입니다. 자동 빈 등록을 사용하면서 수동 빈을 추가할 때 주의해야 하는데, 이 경우 @ComponentScan에서 제외하려고 하신 @Configuration 클래스 내의 @Bean도 함께 제외되어야 정상적으로 빈이 등록됩니다.

AutoAppConfig에서 수동으로 memoryMemberRepository라는 이름의 빈을 등록하려고 했으나, 주석 처리를 해놓으신 상태이고, 스프링의 자동 빈 등록 과정에서 같은 타입의 빈이 또 발견되어 NoUniqueBeanDefinitionException 오류가 발생한 것으로 보입니다.

해결 방법 중 하나로, AutoAppConfig에서 @Bean으로 등록하려는 MemberRepository 빈을 주석 처리해둔 부분을 그대로 두거나, 해당 빈을 완전히 삭제하여 자동으로 같은 타입의 빈이 2개 이상 등록되지 않도록 하는 것입니다. 또 다른 방법으로는 @Qualifier를 사용하여 의존성 주입 시 구체적으로 사용할 MemberRepository 빈을 지정하는 방법이 있습니다.

추가로, CoreApplicationTests가 실행될 때 ApplicationContext를 제대로 로드하지 못했다는 오류 메시지도 확인해보셔야 하는데, 이는 테스트 실행 도중 주입해야 할 빈을 찾을 수 없어서 발생할 수 있습니다. 이 경우 테스트 설정을 점검하거나 @MockBean 같은 테스트 도구를 사용하여 의존성을 명시적으로 제공해야 할 수 있습니다.

아래의 Spring Boot 공식 문서를 참고하시어 테스트 관련 추가 정보를 얻고, 테스트 설정 방법에 대해 더 자세히 알아보시길 권장합니다:

Spring Boot 테스트 구조: 18.16.2. Structure @Configuration classes for inclusion in slice tests
Spring Boot 테스트 설정 탐지: 7.8.3. Detecting Test Configuration
Spring Boot 자동 설정 테스트: 7.10.4. Testing your Auto-configuration
Spring Boot 자동 구성 테스트: 7.8.3. Auto-configured Tests

이 문제를 해결하는 데 도움이 되길 바랍니다.

수빈님의 프로필 이미지
수빈

작성한 질문수

질문하기