프로젝트 개발환경을 업데이트 하던 도중.. 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

+ Recent posts