고딩왕 코범석

Parameter 0 of constructor in 'A' required a bean of type 'B' that could not be found. 본문

Errors

Parameter 0 of constructor in 'A' required a bean of type 'B' that could not be found.

고딩왕 코범석 2020. 12. 17. 20:06
반응형

Parameter {INDEX} of constructor in 'A' required a bean of type 'B' that could not be found.

당신뭐야..ㅠ 왜 내공부 방해하는데!




오늘은 제목에 대한 에러 원인을 파악하다 흥미로운 사실을 알게되어 이곳에 적게되었다.


요즘 한창 인프런에서 김영한님의 JPA 강의를 듣는 중이다. 라이브코딩으로 같이 코드를 적으면서 이해하고 다시 빌드하는 과정에서 저 에러메세지가 뜨고 서버가 올라가지 않았다.



아래 사진은 에러가 난 위치.
에러 메세지에서 A = 'OrderApiController', B = 'OrderQueryService' 가 되겠다. INDEX는 사진상에서 0이되겠지?

KakaoTalk_20201217_194318539

굉장히 허무하게 에러를 찾게 되었는데...
image

맙소사! Service 계층인데 @Service를 안넣어준것!

그래서 후뚝딱 @Service 라고 작성을 해주었다. 깔끔하게 해결이 되었음. 갑자기 의문이 들었다.


왜 안되는건데?


스프링은 컴포넌트 스캔을 통해 의존 관계를 주입해준다.
우리가 알고 있는 @Service, @Repository, @Controller의 어노테이션 문서를 살펴보면 항상 @Component를 포함하고 있다.
그리고 의존관계가 주입된 Bean도 다른 Bean을 주입받을 수 있는데,
이때! 컴포넌트 스캔은 @Component가 달려있는 Bean만 의존관계를 주입시켜줄 수 있다.


그림을 다시보면 나는 의존관계를 주입받을 Bean들을 final 키워드를 이용해 불변으로 지정했고,
lombok의 @RequiredArgsConstroctor를 통해 final 키워드가 붙은 Bean들을 매개변수로 가지는 생성자를 등록했다.
문제의 OrderQueryService에 나는 @Service를 붙여주지 않았고
이로 인해 컴포넌트 스캔 대상에서 OrderQueryService는 포함되지 않아 의존관계를 주입할 때 에러가 발생한 것이다.


정말 어이가없다... 이 글을 읽으신 분들이라면 나처럼 당황하지 말고 에러가 발생한 클래스에서 의존관계를 주입받을 Bean들을
주의깊게 살펴보자!


그럼 안녕..!
반응형