빈 충돌,중복

24.02.18 19:39 작성 조회수 78

0

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

강의에서는 잡혔는데 저는 왜 안잡히고 @Primary,@Qualifier 를 사용하라 하나요?

memoryMemberRepositorymemberRepository라는 두 개의 MemberRepository 빈이 발견되었다는 오류가 뜹니다.

답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.19

안녕하세요, 인프런 AI 인턴입니다.

오키님의 스프링 애플리케이션에서 빈 충돌 문제가 발생한 것 같습니다. @Primary@Qualifier 어노테이션은 스프링이 의존성 주입을 할 때 어떤 빈을 사용해야 하는지 결정하는 데 도움을 주는 어노테이션입니다.

@Primary를 사용하면 스프링은 해당 타입의 빈이 여러 개 있을 경우 @Primary가 붙은 빈을 우선적으로 사용하게 됩니다. 예를 들어, MemberRepository 타입의 빈이 두 개 있고 한 개에 @Primary를 붙였다면, 스프링은 @Primary가 붙은 MemberRepository 빈을 주입합니다.

@Qualifier는 특정 빈을 명시적으로 지정할 때 사용합니다. @Qualifier("빈 이름")과 같이 사용하여 특정 이름을 가진 빈을 주입하도록 할 수 있습니다.

이러한 충돌이 발생하는 경우, 코드 상에서 같은 타입의 빈이 중복으로 생성되지 않도록 주의해야 합니다. @ComponentScan이 스캔하는 범위 내에 서로 다른 설정 클래스나 컴포넌트에서 같은 타입의 빈을 정의하고 있을 수 있습니다. 이 경우, 한쪽의 빈 정의를 제거하거나 이름을 변경하여 충돌을 해결할 수 있습니다.

또한 @ComponentScan이 스캔하지 않도록 해당 클래스나 패키지를 제외하는 방법을 사용할 수도 있습니다. 주석 처리만으로는 충돌이 해결되지 않을 경우 실제 빈 생성 코드가 여전히 남아 있을 수 있기 때문에, @ComponentScan의 excludeFilters 속성을 사용해 강제로 제외하거나, 특정 설정 클래스의 @Configuration 어노테이션을 제거하는 방법이 있습니다.

오키님이 겪고 계신 문제의 동일한 두 개의 MemberRepository 빈 충돌을 해결하기 위해서는 다음과 같은 조치를 취할 수 있습니다:

  1. @Primary 어노테이션을 사용해서 주입하려는 주된 MemberRepository 빈에 명시합니다.
  2. @Qualifier 어노테이션을 사용해서 주입 시점에 특정 빈을 명확하게 지정합니다.
  3. @ComponentScan의 범위를 조정하여 충돌이 발생하는 빈이 스캔 대상에서 제외되도록 합니다.
  4. 중복되는 빈 정의 중 하나를 제거하거나 이름을 변경합니다.

추가적으로, IDE에서 빈을 정의하고 있는 클래스의 코드를 검토하여 충돌 원인을 정확하게 파악하고 그에 맞게 조치를 취하시는 것이 좋습니다.