본문 바로가기
코딩일기

[코딩일기]23년 3월 9일 - 오타 정도는 유도리 있게 해석하면 안되나?(feat.NoSuchBeanDefinitionException)

by 진짠 2023. 3. 9.
728x90

오전부터 내적 분노를 일으켰던 하나의 에러.
 
NoSuchBeanDefinitionException: No bean named 'XXXX' is defined

 

대체 왜그러는데요. 뭐가 문젠데.
 
사실 이 에러는 전에도 많이 봐왔던 에러다. 
 
쉽게 말해서 해당 'XXXX' 이름으로 정의된 bean파일을 찾지 못했다는 것이다.
 
해당 파일이 진짜로 없거나, 환경설정 중 어떤 것이 잘못 되면 이런 오류가 난다.
 
나는 해당 파일을 @Repository 라는 어노테이션을 사용하여 지정해주었다.
 
근데, 어노테이션으로 파일 이름을 지정한 것이 bean파일일까?
 
배웠던 건데도 다시 보니 개념이 정확하지 않아 처음으로 돌아갔다.
 

대충 바빠서 귀찮다는 짤

 
 
먼저, 빈이란 Spring IoC 컨테이너가 관리하는 자바 객체를 뜻한다.
 
스프링에서는 이 객체라는 개념이 매우 중요한데
각 객체들이 프로그램의 흐름을 결정하고 객체를 직접 생성하고 조작하기도 한다.
 
그래서 스프링 내에서 관리되는 이러한 객체를 Bean 이라고 하는 것이다.
 
그리고 이러한 Bean객체를 Controller에 등록하기 위해 어노테이션을 사용한다.
 
그러니까 내가 사용했던 @Repository 외에도 @Component, @Controller 따위의 다른 어노테이션을 사용하여 빈 객체를 등록하는 것이다.
 
그렇다면 다른 어노테이션 중 왜 @Repository를 사용했지?
 
구글링 결과 결론적으로는 그냥 명시적으로 구분해주기 위해서 란다. 
 
부모 어노테이션인 @Component를 붙여도 상관이 없다.
 
또한, Bean 객체는 데이터 변경이 없는 객체에 한해 사용해야 한다는 점이 있다.

 

컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)

 

(여기서 왜 @Repository를 쓰는지 알게됐다는.. 외부 작업 처리를 위해 썼었구나!)
 

그럼 결론적으로, 해당 이름으로 정의된 Bean 객체가 없어서 오류가 났다는 뜻인데..
 
난 분명 이름을 지정했는데 왜 오류가 나나 고민하던 내 눈에 보인건 오타 알파벳 한 자였다.
 

내적 분노

그래서 그걸 고쳤더니 잘 돌아간다.
 
...
이 김에 개념 다시 한번 체크하고 간 걸로 만족하련다.
 
참고로 xml파일 설정을 잘못하거나 메이븐 빌드 오류가 났을 수도 있다고 한다.
 
개인 프로젝트라면 한번씩 다 체크해봐야 한다.
 
1)SERVICE단에서 오류가 발생했다면? Impl자바 파일의 @Service어노테이션과 Controller자바 파일의 @Resource이름을 확인할 것(대소문자 구분)
 
2)resource폴더가 deploy 되지 않았다? 프로젝트 > Properties > Deployment Assembly 선택 후
/src/main/resource - WEB-INF/classes 
를 추가해주자. 
 
3)dispatcher-servlet.xml설정 오류라면? 
<context:component-scan base-package="베이스패키지명">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
...
요 부분이 제대로 적혀 있는지 확인해보자.
 
4)그래도 안되면 프로젝트 clean, 메이븐 clean 해보자.
 
암튼 이클립스는 코딩보다 설정하는 부분이 훨씬 어렵게 느껴져 학습이 필요한 듯 하다.
 
암튼 그렇게 오전에 작은 소동은 마무리되었다.
 
첫 일기인데 뭔가 정보글이 되어버린 것 같지만 앞으로도 코딩하면서 기상천외하고(?) 어이없는 일들이 일어날 때 마다 작성을 해볼까 한다.
 

그럼 이만.

 

728x90

댓글