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
'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 |
댓글