SPRING
2020.01.31 / 11:15

[Spring] 빈 생성 에러 디버그 Error creating bean with name 'XXX'

보르미
추천 수 12

스프링은 자바에서 MVC 패턴을 이용해 개발을 할 수 있게 도와준다. 

또한 자바의 철학에 맞게 확실한 데이터 형과 문법, 그리고 Bean이라는 개념을 통해 객체 지향 프로그래밍을 사용하고.. 이를 통해 협업을 할 수 있도록 설계를 할 수 있게 해준다.


제목에 적힌 빈 생성 에러의 경우 크게 두세가지 의 이유로 에러가 발생한다.

또한 어떤 것을 빠트렸냐에 따라서 에러가 나는 빈의 종류가 다르다.  

에러 메시지에 따라 해결 방법을 사례별로 정리해 두었다.


디버깅을 위해서던 검색하다가 개념 숙지용으로 보았던 간에.. 스프링의 Flow에 관한 이야기 이므로.. 쭉 읽어보고 이해가 안간다던지 검증하여 숙지하길 바란다. (절대로 암기하지말고 이해해야 한다.)


이 Flow을 모른다면 스프링을 안다고 할수 없다.


Error creating bean with name "XXXController"


만약 컨트롤러(Controller) 에서 빈생성 에러가 난다면, 그것은 servlet(서블릿)에서 에러의 원인을 의심해보아야 한다.

스프링의 전체적인 데이터 순환? 을 간단히 적어서 생각해보면


사용자가 어떤 요청을 하면 그것을 가장 먼저 Servlet이 받아서 Controller에 Mapping을 확인 한 뒤, 해당 Mapping의 코드로 전달되고 이후에 Service단을 통해 DAO를 거쳐가는 것이 먼저 학습되어 있어야 한다.   


주로 빈 생성 에러는 서버를 새로 시작할 때 에러가 발생 할텐데 서버가 시작하고 / 혹은 index.do 와 같은 메인 페이지에 요청을 보낼 것이다. 이 때 Servlet이 요청을 받고 Controller 에 있는  Mapping을 확인해야 하는데 Controller 자체를 찾을 수 없다면? 코드의 문제가 아니라 이전의 Servlet의 properties.. 즉 설정값 세팅 에서 에러가 발생했을 것이다.


해결 방법


고로 Controller 빈 생성 에러가 발생 했다면 servlet-context.xml 같은 servlet을 확인해서  

<context:component-scan base-package="패키지명" />에 현재 작업중인 프로젝트의 패키지명.. 즉 컨트롤러가 포함된 패키지의 위치를 정확하게 기재 하시길.. (그냥 컨트롤러에 패키지를 그대로 복사해서 넣으시는 걸 추천)


그리고 @Controller 어노테이션이 없어서 일수도 있다 -> 이건? 당연하다. Controller를 찾아서 URL의 Mapping을 찾아야 하는데.. 컨트롤러 자체를 찾지 못했을테니


"그래도 안되는데??"


Unsatisfied dependency expressed through field 'XXXService';


만약 servlet-context.xml에 (이하 servlet)에서 패키지를 입력하고도.. 또 빈 생성 에러가 발생할 수 있다

근데 끝까지 읽어보면 뒤에 Service단에서 에러가 발생합니다. 이는.. Service단에 어노테이션이 없어서 일것이다


@Service 혹은 @Component 같은 어노테이션을 추가하세요. 기존 프로젝트가 있다면 다른 서비스단을 참조하면 된다.



"그래도 안되는데??"


Unsatisfied dependency expressed through field 'XXXServiceImpl';


네 만약 또 안될 수도 있습니다. -_-;; 이번엔 과연 뭐 때문일까요?
처음에는 인터페이스인 Service 였는데.. 이번엔 인터페이스를 구현하고 있는 ServiceImpl에서 빈 생성의 이유가 나옵니다.
마찬가지로 ServiceImpl에 가셔서 @Repository 어노테이션을 추가해주세요.




스프링의 어노 테이션을 조금 더 구체적으로 익혀두면 좋겠습니다!


PS) 트랙백에서 보니 SQL문을 담고있는 mapper xml에서 쿼리에 오타가 발생했거나 에러가 발생하면 빈 에러가 발생하기도 한답니다.
제 포스팅의 경우 주로 Servies나 DAO를 추가했을때 빈번하게 나는 에러이며 프로젝트 초기에 세팅시 발생하는 경우입니다.


학습 출처 : 
http://noritersand.tistory.com/156#@Repository

http://beagle-dev.tistory.com/122



출처: https://liante0904.tistory.com/113 [Liante의 이야기]