UnsatisfiedDependencyException
스프링에서 UnsatisfiedDependencyException이 발생하는 경우가 있습니다. UnsatisfiedDependencyException은 예외명에서도 알 수 있듯이 스프링 빈 객체들이 생성되는 과정에서 의존주입을 하게 되는데, 필드에 해당하는 의존관계를 만족시킬 수 없을때 발생하는 예외입니다.

쉽게 말해 의존관계를 설정하는데 실패했다는 뜻입니다.
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sequenceGenerator': Unsatisfied dependency expressed through field 'userService'; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.dololak.tistory.service.UserService' available: more than one 'primary' bean found among candidates: [UserServiceImplA,UserServiceImplB,UserServiceImplC]


NoUniqueBeanDefinitionException 발생
그 중에서도 여러 이유가 있겠지만 대표적인 사례중 하나가 NoUniqueBeanDefinitionException입니다. 스프링은 @Autowired 어노테이션을 사용하여 타입에 맞는 객체가 스프링컨테이너에 존재하는지 검사하여 자동 의존주입을 하게 됩니다.


그러나 위와 같은 경우 UserService 타입의 구현체가 여러개 존재하고 스프링 컨테이너에 빈으로 등록되어 있는 경우 스프링컨테이너는 어떤 UserService를 의존주입해야 할지 판단하지 못해 NoUniqueBeanDefinitionException(유일하지 않은 빈 정의 예외)가 발생합니다.


@Primary 빈이 여러개인 경우
스프링은 하나의 타입에 빈 객체가 여러개인경우 그 중 우선순위를 갖는 빈이라는것을 지정할 수 있도록 @Primary 어노테이션을 제공하고 있습니다.


@Primary 어노테이션이 위와 같이 UserServiceImplA에 붙으면 여러개의 UserService 구현체들 중 UserServiceImplA 빈이 우선순위를 갖고 의존주입시 사용됩니다.

그러나 @Primary는 스프링 Java Config 등 여러곳에 사용될 수 있기때문에 이마저도 중복되는 경우에는 마찬가지로 NoUniqueBeanDefinitionException이 발생하게 되고 이때 예외 메시지로 more than one 'primary' bean found among candidates: [UserServiceImplA,UserServiceImplB,UserServiceImplC] 이 출력되는 것입니다.



최종 결론
@Autowired를 사용할때 구현체가 여러개인 경우에는 중복되지 않도록 @Qualifier나 @Primary 등으로 특정 빈이 의존주입되도록 명시해 주도록 합니다. 기본 빈 객체 명시를 위해 @Prmary를 선언하더라도 여러개에 걸쳐 중복 선언되는 경우에는 NoUniqueBeanDefinitionException이 발생합니다.
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!