💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.
목차
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이라는 파일에 다음과 같이 오류 화면을 등록해 사용하였다.
스프링 부트를 사용해 서블릿 오류 페이지 등록 방법
- 서블릿 오류 페이지를 등록 해준다.
- 오류가 발생했을 때 처리할 수 있는 컨트롤러를 만들어준다.
- 오류 처리에 맞는 뷰를 생성해준다.
서블릿 예외 처리 - 오류 페이지 작동 원리
서블릿은 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 상태 코드
'Back-End > Spring' 카테고리의 다른 글
[Spring MVC2][예외 처리와 오류 페이지] - 스프링이 지원하는 오류 페이지 처리 방식 (0) | 2022.05.30 |
---|---|
[Spring MVC2][예외 처리와 오류 페이지] - 필터와 인터셉터 (0) | 2022.05.28 |
[Spring MVC2][예외 처리와 오류 페이지] - 서블릿 예외 처리 (0) | 2022.05.28 |
[Spring MVC2][로그인 처리] - 스프링 인터셉터(공통의 관심사 해결 방안) (0) | 2022.05.20 |
[Spring MVC2][로그인 처리] - 서블릿 필터(공통의 관심사 해결 방안) (0) | 2022.05.19 |