스프링 프로젝트 진행 중 Tomcat 7 버전에서 9 버전으로 업그레이드한 이후, 서버 콘솔에 error.jsp 관련 에러 로그가 반복적으로 출력되는 현상이 발생하였다.
에러 내용
ERROR 17:32:01.300 [http-nio-8123-exec-4] org.apache.jsp.jsp.error.error_jsp [_jspService:135] - error
에러 파악
web.xml 파일을 확인한 결과, <error-page> 설정에 <error-code>나 <exception-type>이 명시되어 있지 않았다. Tomcat 7까지는 이러한 설정 누락에도 불구하고 서버가 처리(fallback)했기 때문에 문제가 드러나지 않았다. 그러나 Tomcat 8부터는 Servlet 스펙 준수 기준이 강화되어, <error-code> 또는 <exception-type>이 없는 <error-page> 설정은 정상적으로 처리되지 않도록 변경되었다. 이로 인해 request 객체에 exception 정보가 세팅되지 않고, error.jsp 내부에서 추가 에러 로그가 발생하게 된 것이다.
해결 방법
web.xml 내 <error-page> 설정에 <exception-type>을 추가하여 매핑을 명확히 설정하였다.
// 수정 전
<error-page>
<location>/jsp/error/error.jsp</location>
</error-page>
// 수정 후
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/jsp/error/error.jsp</location>
</error-page>
해당 에러의 근본 원인은, web.xml 내 에러페이지 매핑 설정이 불완전했던 데에 있다. Tomcat 7까지는 서버가 fallback 처리했기 때문에 문제가 드러나지 않아서 몰랐지만, Tomcat 8부터 Servlet 스펙 준수가 엄격해지며 잘못된 설정이 실제 에러로 보여지게 되었다. 이에 따라, <error-page> 설정에 <exception-type>을 명시함으로써 문제를 해결하였다.