인프런 커뮤니티 질문&답변
빈 충돌,중복
작성
·
174
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
오키님의 스프링 애플리케이션에서 빈 충돌 문제가 발생한 것 같습니다. @Primary와 @Qualifier 어노테이션은 스프링이 의존성 주입을 할 때 어떤 빈을 사용해야 하는지 결정하는 데 도움을 주는 어노테이션입니다.
@Primary를 사용하면 스프링은 해당 타입의 빈이 여러 개 있을 경우 @Primary가 붙은 빈을 우선적으로 사용하게 됩니다. 예를 들어, MemberRepository 타입의 빈이 두 개 있고 한 개에 @Primary를 붙였다면, 스프링은 @Primary가 붙은 MemberRepository 빈을 주입합니다.
@Qualifier는 특정 빈을 명시적으로 지정할 때 사용합니다. @Qualifier("빈 이름")과 같이 사용하여 특정 이름을 가진 빈을 주입하도록 할 수 있습니다.
이러한 충돌이 발생하는 경우, 코드 상에서 같은 타입의 빈이 중복으로 생성되지 않도록 주의해야 합니다. @ComponentScan이 스캔하는 범위 내에 서로 다른 설정 클래스나 컴포넌트에서 같은 타입의 빈을 정의하고 있을 수 있습니다. 이 경우, 한쪽의 빈 정의를 제거하거나 이름을 변경하여 충돌을 해결할 수 있습니다.
또한 @ComponentScan이 스캔하지 않도록 해당 클래스나 패키지를 제외하는 방법을 사용할 수도 있습니다. 주석 처리만으로는 충돌이 해결되지 않을 경우 실제 빈 생성 코드가 여전히 남아 있을 수 있기 때문에, @ComponentScan의 excludeFilters 속성을 사용해 강제로 제외하거나, 특정 설정 클래스의 @Configuration 어노테이션을 제거하는 방법이 있습니다.
오키님이 겪고 계신 문제의 동일한 두 개의 MemberRepository 빈 충돌을 해결하기 위해서는 다음과 같은 조치를 취할 수 있습니다:
@Primary어노테이션을 사용해서 주입하려는 주된MemberRepository빈에 명시합니다.
@Qualifier어노테이션을 사용해서 주입 시점에 특정 빈을 명확하게 지정합니다.
@ComponentScan의 범위를 조정하여 충돌이 발생하는 빈이 스캔 대상에서 제외되도록 합니다.
- 중복되는 빈 정의 중 하나를 제거하거나 이름을 변경합니다.
추가적으로, IDE에서 빈을 정의하고 있는 클래스의 코드를 검토하여 충돌 원인을 정확하게 파악하고 그에 맞게 조치를 취하시는 것이 좋습니다.





강의 중에 빈충돌로 인한 코드를 잡는데 주석처리를 해도 잡히지가 않네요