Back-End/Spring

[Spring MVC2][예외 처리와 오류 페이지] - 서블릿 예외 처리를 사용해서 오류 화면을 제공해보자

얄루몬 2022. 5. 28. 15:30

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/vQHp

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com


목차
1. 서블릿 예외 처리 - 오류 화면 제공
2. 서블릿 예외 처리 - 오류 페이지 작동 원리
3. 서블릿의 예외 처리 - 오류 페이지 작동 원리 정리

서블릿 예외 처리 - 오류 화면 제공

 

서블릿 컨테이너가 제공하는 기본 예외 처리 화면은 고객 친화적이지 않다는 단점이 있다. 서블릿이 제공하는 오류 화면 기능을 사용해보자.

web.xml을 사용한 오류 화면 등록 방법

<web-app>
 <error-page>
 <error-code>404</error-code>
 <location>/error-page/404.html</location>
 </error-page>
 <error-page>
 <error-code>500</error-code>
 <location>/error-page/500.html</location>
 </error-page>
 <error-page>
 <exception-type>java.lang.RuntimeException</exception-type>
 <location>/error-page/500.html</location>
 </error-page>
</web-app>

과거에는 web.xml이라는 파일에 다음과 같이 오류 화면을 등록해 사용하였다.

스프링 부트를 사용해 서블릿 오류 페이지 등록 방법

  1. 서블릿 오류 페이지를 등록 해준다.
  2. 오류가 발생했을 때 처리할 수 있는 컨트롤러를 만들어준다.
  3. 오류 처리에 맞는 뷰를 생성해준다.

서블릿 예외 처리 - 오류 페이지 작동 원리

서블릿은 Exception(예외) 발생해서 서블릿 밖으로 전달되거나 또는 response.sendError( )가 호출되었을 때 설정된 오류 페이지를 다음과 같은 흐름으로 찾는다.

예외 발생 흐름

WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)

sendError 흐름

WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러 (response.sendError())

WAS의 오류 페이지 요청

  • 컨트롤러에서 발생한 예외나 sendError가 WAS까지 전달되면 WAS는 오류 페이지 정보를 확인한다.
  • WAS는 예외와 sendError( ) 정보를 확인한 후 저장된 오류 페이지가 지정되어 있다면 오류 페이지 출력을 위해 다시 요청을 한다.

오류 페이지 요청 흐름

WAS `/error-page/500` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error-page/ 500) -> View
*이때 오류 페이지 경로로 필터, 서블릿, 인터셉터, 컨트롤러가 모두 다시 호출된다!!
  • 웹 브라우저(클라이언트)는 서버 내부에서 이런 일이 일어나는지 전혀 모른다. 이러한 작업과 흐름은 오직 서버 내부에서 오류 페이지를 찾기 위한 추가 호출일 뿐이라는 점이다.

서블릿의 예외 처리 - 오류 페이지 작동 원리 정리

  • 컨트롤러에서 예외나 response.sendError( )가 발생하면 WAS까지 흘러 전파된다.
  • WAS는 오류 페이지 경로를 찾아 내부에서 오류 페이지를 호출한다. 이때 오류 페이지 경로로 필터, 서블릿, 인터셉터, 컨트롤러가 모두 다시 호출된다.
  • 오류 정보 추가
    • WAS는 오류 페이지를 단순히 다시 요청하는 것뿐만 아니라, 오류 정보를 request의 attribute에 추가해서 넘겨준다.
    • 필요하다면 오류 페이지에서 전달된 오류 정보를 사용할 수 있다. (뷰템플릿을 사용해서 오류 정보를 보여줄 수도 있지만 실제로 오류 정보를 내비추는 것은 매우 지양해야 되는 일이다.)
      • request.attribute에 서버가 담아준 정보
      • javax.servlet.error.exception : 예외
      • javax.servlet.error.exception_type : 예외 타입
      • javax.servlet.error.message : 오류 메시지
      • javax.servlet.error.request_uri : 클라이언트 요청 URI
      • javax.servlet.error.servlet_name : 오류가 발생한 서블릿 이름
      • javax.servlet.error.status_code : HTTP 상태 코드