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