hades

[Spring] 같은 클래스의 빈이 두 개 이상일 때 본문

🏃🏻‍♂️ 기본훈련/Spring

[Spring] 같은 클래스의 빈이 두 개 이상일 때

hades1 2024. 7. 25. 16:13

🚨 에러

Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found:
- memoryMemberRepository: defined in file [C:\Users\hades\Desktop\study\core\out\production\classes\hello\core\member\MemoryMemberRepository.class]
- memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]

 

🔍 분석

MemberServiceImpl이 하나의 빈을 요구하는데, 2개가 발견되었다고 한다.

MemberServiceImpl은 MemberRepository를 주입받고 있다.

 

2개의 빈이 발견된 지점으로 가보자.

 

@Component
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

MemoryMemberRepository는 @AutoScan에 의해 memoryMemberRepository라는 스프링 빈으로 등록된다.

 

@Configuration
public class AppConfig {
    ...
    
    @Bean
    public MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    
    ...


}

@Bean에 의해 메소드 명인 memberRepository으로 스프링 빈에 저장된다.

 

따라서, MemberServiceImpl은 주입받을 수 있는 MemberRepository가 2개인 것이다.

 

👊 해결

가장 쉬운 방법은 memoryMemberRepository에서 @Component를 지우던지, AppConfig에서 memberRepository 메소드를 지우면 된다.

 

근본적으로는 @AutoScan과 @Configuration을 둘다 사용했기 때문에 문제가 발생한다. 이 둘 중 하나를 지우는 것이 바람직할 것이다.

'🏃🏻‍♂️ 기본훈련 > Spring' 카테고리의 다른 글

[Thymeleaf] 텍스트 리터럴  (0) 2024.08.05
[Thymeleaf] 템플릿 위치  (0) 2024.07.29
[Spring] 스프링 기초 (3)  (0) 2024.07.27
[Spring] 스프링 기초 (2)  (0) 2024.07.24
[Spring] 스프링 기초 (1)  (0) 2024.07.22