1.문제 정의
- 문제 요약 : 하나의 인터페이스에서 여러개 구현채를 DI할때 문제 발생
- 발생 일시 : 2024년 3월 28일
- 발생 장소 : 로컬 개발 환경
2. 증상 기술
-
상세 증상 : 이메일 전송 시 하나의 “이메일 인터페이스”를 여러 개의 구현체로 나누고, 각 서비스마다 다른 구현체를 사용하려고 @Qualifier 애노테이션을 사용했습니다. 그러나 Bean을 찾을 수 없는 오류가 발생했습니다.
-
에러 메시지 : NoUniqueBeanDefinitionException 예외 발생
-
첨부 사진 :

3. 원인 분석
- 원인 가설 :
- 구현체가 여러 개라 빈을 찾을 수 없는 문제: @Autowired를 사용했을 때 동일한 타입의 빈이 여러 개 있어서 스프링이 어느 빈을 주입해야 할지 몰라 발생했을 가능성.
- @Qualifier 애노테이션 사용 오류: @Qualifier 애노테이션을 올바르게 설정하지 않았거나, 애노테이션의 이름이 빈 이름과 일치하지 않아 발생했을 가능성.
- 구현체 등록 문제: 구현체가 스프링 컨텍스트에 제대로 등록되지 않아 발생했을 가능성.
- 컴포넌트 스캔 문제: 특정 패키지에서 컴포넌트 스캔이 제대로 이루어지지 않아 발생했을 가능성.
- 검증 과정 :
- @Autowired와 @Qualifier 애노테이션을 사용한 부분을 검토했습니다.
- @Qualifier 애노테이션의 이름과 실제 빈 이름이 일치하는지 확인했습니다.
- 각 구현체가 @Component, @Service, @Repository 등의 애노테이션을 사용하여 스프링 컨텍스트에 등록되었는지 확인했습니다.
최종 원인 : @RequiredArgsConstructor 어노테이션은 final이거나 @NonNull이 붙은 필드에 대해 생성자를 자동으로 만들어 주기 때문에 @Qualifier 어노테이션이 붙은 필드에 대해서는 @Qualifier 어노테이션을 생성자의 매개변수에 복사하지 않기 때문에 생성자를 주입할 수 없는 오류가 발생되는 것을 확인했습니다.
4. 해결 방법
-
조치 내용 :
- Lombok.config 파일 작성:
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
-
결과 확인 : 정상적으로 오류없이 실행되며**,** @Qualifier 설정한 빈을 불러오는 것을 확인했습니다.

5. 추가 참고 자료