프로젝트 개발환경을 업데이트 하던 도중.. Spring 관련 설정 하나 바꾼 것이 에러를 발생시켜 2~3시간 동안 매달렸다.
같이 일하시는 차장님이 도와주셔서 다행히 에러 원인을 찾았다 ㅜㅜ 차장님 아니었으면 해결 못했을 뻔....
이번 정리로, 또 한번 새겨야겠다 설정 바꿀때는 항상 신중하게!!!!
우선, 새로운 프로젝트의 기존 개발환경은 Spring 3.1.1 버전이었다. 이를 사내 프레임워크에 맞게 현행화 하기 위하여
Spring 4.3.3 버전으로 업데이트 했다.
1) 배경
- 개발환경 Spring 3.1.1 --> 4.3.3 버전 업데이트
2) 에러
- 화면 이벤트 발생 시 해당 결과값을 받아오지 않음. 개발자 도구(F12)로 확인해도 에러 떨어지는 게 없고, 서버에도 에러 로그 남는게 없다..
3) 원인
- 소스코드 체크아웃 받은 이후로 건드린 소스가 없어서 왜 내 로컬에서만 해당 에러가 발생할까 고민이 많았다. 나만 바꾼거 위주로 거슬러 올라가
생각하다보니 spring 설정이 생각났다. ㅎㅎ
- dispatcher-servlet.xml 파일 내 BeanNameViewResolver 설정을 제거한 것이 문제였다.
[AS-IS]
: BeanNameViewResolver 설정 제거
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> <property name="order" value="1" /> </bean> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="0" /> </bean> |
- 해당 설정이 없으니, view 매핑이 제대로 이루어지지 않아 결과값을 뿌려줄 화면을 못찾았던 것.
- 참고로, BeanNameViewResolver는 view 이름과 동일한 이름을 갖는 bean 객체를 view 객체로 사용한다. order도 0이여서
InternalResourceViewResolver 보다 먼저 찾았겠넹... ㅎㅎ
4) 해결
- BeanNameViewResolver 설정을 다시 원복한 후 view 맵핑이 정상적으로 처리되었다.
- spring 4.x 에 와서 deprecated 된 애도 아닌데 내가 왜 이 설정을 제거했는지 모르겠다.............. ㅎㅎ;;
하나 제거할때마다 신중하게 테스트해보고 커밋하기 ㅎㅎ
5) 참고자료
[BeanNameViewResolever]
- BeanNameViewResolver는 spring container에 bean으로 등록된 view 이름을 찾아 사용하는 resolver.
- modelAndView를 반환할 때 viewName을 셋팅하여 리턴하면 해당 beanName을 가진 view를 찾는다.
- 커스텀 view 클래스를 view로 사용하는 경우 주로 사용한다.
- 하나의 Dispatcher-Servlet은 다수의 viewResolver를 사용할 수 있다(order 옵션으로 먼저 사용할 resolver 지정하여 사용)
우선순위(order)는 0 부터 0,1,2...의 형태로 부여되며, 우선순위가 높은 viewResolver가 null을 리턴하면, 그 다음 우선순위를 가진 viewResolver에게
view가 요청된다.
- 주의할 점은, InternalResourceViewResolver는 항상 우선순위 마지막에 놓도록 한다. InternalResourceViewResolver는 항상 view이름에 매핑되는 view 객체를 리턴하기 때문에(prefix, suffix 사용하여) null을 리턴하지 않는다. InternalResourceViewResolver가 우선순위가 높을 경우 그보다 낮은 우선순위
의 viewResolver들은 사용되지 않게 된다.
[InternalResourceViewResolver]
- Resource를 대상으로 view를 찾는데, 정적 자원 즉, webapp 아래 자원들을 반환값으로 찾게 된다. 컨트롤러가 지정한 view 이름으로부터
실제로 사용될 view를 선택한다.
- 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 붙인 값이 실제로 사용될 자원의 경로가 된다.
__________________________________________________________________________________________________________________________________________________________
** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :)
** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.
** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.
- http://snoopy81.tistory.com/325
- http://blog.naver.com/PostView.nhn?
blogId=chm8410&logNo=220375757503&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
'Spring' 카테고리의 다른 글
[에러] no matching editors or conversion strategy found (0) | 2017.04.20 |
---|---|
(작성중) dispatcher-servlet.xml 설정 (0) | 2017.04.16 |
spring - profile (0) | 2017.03.19 |
[Spring] Transaction 관리 (0) | 2017.03.12 |