안녕하딤니카 여러분
오늘은 스프링에서 의존관계 주입을 하다보면 가끔 볼 수 있는
BeanNotOfRequiredTypeException 에 대해서 알아보겠어요
대체 BeanNotOfRequiredTypeException 는 왜 생기는지 어케 해결하면 되는지 정리해보겠습니다
레 쭈 고
1. BeanNotOfRequiredTypeException 에러 발생의 원인
- 빈 등록이 올바르게 되어있지 않은 경우 : 의존성 주입을 위해 @Autowired 또는 @Inject 등의 어노테이션을 사용하여 해당 타입의 빈을 주입받는 클래스가 있는데, 해당 빈이 스프링 컨테이너에 제대로 등록되어 있지 않은 경우에 발생할 수 있다.
- 빈 이름 충돌 : 스프링은 빈을 등록할 때, 기본적으로 빈의 이름을 해당 클래스의 이름(첫 글자는 소문자)으로 설정하는데, 만약 다른 곳에서 이미 같은 이름으로 빈을 등록했는데 타입이 다르다면 이러한 충돌로 인해 위와 같은 에러가 발생할 수 있다.
- 컴포넌트 스캔 설정 오류 : 스프링에서 @ComponentScan을 사용하여 컴포넌트를 스캔하는 설정이 올바르지 않거나 누락된 경우에도 위와 같은 에러가 발생할 수 있다.
- 테스트 환경 설정 오류 : 테스트 클래스에서 스프링 컨텍스트를 초기화하거나 관련된 설정을 정확하게 수행하지 않은 경우에도 이러한 문제가 발생할 수 있다.
보통 빈이 올바르게 등록되어있지 않을 때 터지는 에러 같고, 이런 원인이 있으니 이제 에러 메시지를 보겠습니다
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'orderService' is expected to be of type 'hello.core.order.OrderServiceImpl' but was actually of type 'org.springframework.beans.factory.support.NullBean'
at org.springframework.beans.factory.support.AbstractBeanFactory.adaptBeanInstance(AbstractBeanFactory.java:417)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:398)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1163)
at hello.core.singleton.ConfigurationSingletonTest.configurationTest(ConfigurationSingletonTest.java:19)
에러메시지를 보면
'orderService' 라는 이름의 빈이 예상되는 타입인 'hello.core.order.OrderServiceImpl' 으로 예상되었지만, 실제로는 'org.springframework.beans.factory.support.NullBean' 이라는 타입으로 등록되었다. 라고 얘기하고있습니다 (아마도)
저는 강의 들으면서 실습 하다가 잠깐 빈 코드 안에 return 값을 null 로 써놨더니 이렇게 된 거였습니다...
전 이런걸 바보이슈 라고 합니다 skrrrr
암튼 제가 작성한 코드를 보겠습니다
// 에러 발생한 빈 코드
@Bean
public OrderService orderService() {
System.out.println("call AppConfig.orderService");
// return new OrderServiceImpl(memberRepository(), discountPolicy());
return null;
}
// 에러 해결을 위해 주석으로 막아둔 return 값 원복
@Bean
public OrderService orderService() {
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
// return null;
}
저는 실습 코드의 의존관계 주입 관련 코드는 전부 AppConfig.java 파일에 적어뒀는데
그 중에서 orderService 빈 코드에 주석으로 막아둔 부분을 원복하지 않아서 발생한 에러였습니다
return 에 넣어둔 null 을 없애고, 그 윗줄에 주석으로 막아둔 코드를 원복시켰더니 빈 등록이 정상적으로 되어
BeanNotOfRequiredTypeException 은 해결되었습니다
모든 분들이 저와 같은 상황은 아닐 것 같아서
BeanNotOfRequiredTypeException 에러 해결 방법을 적어두겠어요
보통 에러메시지 읽어보면 어디서 빈 등록이 잘못 되었는지 확인 가능해서... 그거 보고 찾으시면 금방 찾을 것 같습니다
2. BeanNotOfRequiredTypeException 에러 해결 방법
- 에러메시지가 표시하는 빈이 정확하게 어떻게 등록되어 있는지 확인하기 (저처럼 빈 등록 파일이 따로 있는 경우에는 그쪽에서 확인하는 것이 빠른 방법)
- 해당 빈을 주입받는 클래스의 코드를 확인하여, 어떤 방식으로 의존성을 주입받고 있는지 확인하기
- 스프링 컴포넌트 스캔 설정 및 테스트 환경 설정을 확인하여 올바르게 설정되어 있는지 확인하기
- 다른 빈 등록과의 이름 충돌이 있는지 확인하기
저는 비교적 빠르게 해결했지만
콘솔창에서 처음 저 에러를 발견했을때는 머리가 좀 하얘졌거든요
바보이슈에서 그친게 다행이었따~ 라는 생각이었습니다
이 글을 보시는 분들은 원인 파악에 오랜 시간이 걸리지 않길 바라며...
전 이만 총총총
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > Spring' 카테고리의 다른 글
| MySQL에서 제공하는 Lock을 이용해서 동시성 제어하기 (Pessimistic Lock, Optimistic Lock, Named Lock) (0) | 2024.08.17 |
|---|---|
| 선착순 쿠폰 발급 시스템 로직 변경으로 Redis의 Set 자료구조 찍먹해보기 (0) | 2024.07.02 |
| 선착순 쿠폰 발급 시스템 개발을 통해 Redis 랑 Kafka 찍먹해보기 (2) | 2024.07.01 |
| [Spring] Validation (검증) 처리 방법 및 properties 파일의 한글이 출력되지 않는 문제 해결 방법 (2) | 2023.10.12 |
| [Spring] Autowire 불가 에러 해결 방법 (Could not autowire, 스프링 빈 등록 불가 에러) (0) | 2023.09.26 |