본문 바로가기
IT/Java

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

by 성준하이 2023. 7. 23.
반응형

spring 개발 할 시 제목과 같은 이 에러가 날 경우 해결법이다.

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

 

그대로 번역기를 돌리면 아래와 같은 내용이다.

빈 중 하나를 @Primary로 표시하거나 여러 빈을 허용하도록 소비자를 업데이트하거나 소비해야 하는 빈을 식별하기 위해 @Qualifier를 사용하는 것을 고려하십시오.

 

그리고 이 에러도 중요하지만 바로 위에 함께 나왔을 에러도 봐줘야한다.

Description:


Parameter 0 of constructor in com.sungjun.bean.MultiBeanTestController required a single bean, but 2 were found:
- multiBeanTestServiceImpl: defined in file [/Users/eclipse-workspace/testProject/target/classes/com/bean/MultiBeanTestServiceImpl.class]
- multiBeanTestServiceImpl2: defined in file [/Users/eclipse-workspace/testProject/target/classes/com/bean/MultiBeanTestServiceImpl2.class]

이유는 의존성이 주입될때 Type기준으로 주입이 되게 되는데,

지금의 경우에는 MultiBeanTestServiceImpl 와 MultiBeanTestServiceImpl2 가 동일한 Bean으로 주입이 되서 문제이다.

실제로 코드를 들어가서 보면 결국 두 코드 모두 동일한 interface를 implements 해두고 있었다.

 

해결법은 에러에 나와있다.

  • @Primary 사용
  • @Qualifier 사용

한가지씩 코드로 살펴보도록 할것이다.

Primary 사용

사용이 간단하다.

@Service
@Primary
public class MultiBeanTestServiceImpl implements MultiBeanTestService{
     @Override
     public void test1() {
     
...이하 생략

MultiBeanTestService 을 implements 하는 클래스들중 사용할 클래스에 이렇게 Primary annotation을 달아주면 해당 클래스가 기본이 되어 동작을 한다.

 

Qualifier 사용
public class MultiBeanTestController {

     private final MultiBeanTestService multiBeanTestService;

     public MultiBeanTestController(@Qualifier("test1") MultiBeanTestService multiBeanTestService) {
          this.multiBeanTestService = multiBeanTestService;
     }

...이하 생략

이렇게 생성자를 선언할때 Qualifier 를 설정하고,

@Service
@Qualifier("test1")
public class MultiBeanTestServiceImpl implements MultiBeanTestService{
     @Override
     public void test1() {
     
...이하 생략

MultiBeanTestService 을 implements 하는 클래스들중 사용할 클래스에 이렇게 똑같이 Qualifier를 설정해준다.

이 사용은 Spring Bean에 등록된 이름을 바꾸는건 아니고 별칭을 주는거라고 생각하면 이해가 빠를것이다.

 

물론 Bean에 등록을 할때는 이름이 겹치지 않고 동일한 내용을 주입하지 않는것이 중요하지만,

로직, 비지니스 상 사용할 경우에는 이 포스팅에서 소개한것처럼 사용이 가능하다.

 

그러면서 상황에 따라 전략을 바꿔가며 코드의 다형성을 적용시켜서 전략패턴을 구현까지도 기대할수 있다.

 


참고 포스팅

https://thenicesj.tistory.com/146

 

객체지향 디자인 패턴 심화 정리 part.1

포스팅을 읽기 전에 아래 참고 포스팅에서 간단한 디자인패턴에 대한 정의와 종류에 대해서 읽고 오면 도움이 될것이다. 그리고 이번 포스팅에서는 좀더 심화된 내용을 다뤄볼 것이다. 저번 포

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

Spring 에서 Singleton  (51) 2023.07.28
Queue (LinkedList) 사용법  (63) 2023.07.26
의존관계 주입시 Bean이 없을때  (63) 2023.07.22
디컴파일에 대해(.jar 파일, .class파일)  (32) 2023.07.21
Log level 에 대해  (61) 2023.07.17

댓글