- Spring MVC 마스터하기 예외처리 22022년 06월 11일
- starryeye
- 작성자
- 2022.06.11.:46
예외처리 1번 포스팅에서는
서블릿 컨테이너에서 처리 할 수 있는 예외를 알아보았다.. (혹은,, 예외가 발생 했다고 알아볼 수 있는.. 플래그..?)
1. 일반 Exception
2. sendError 메서드
근데.. 톰캣 or 스프링에서 기본적으로 보여주는 뷰를 사용자에게 직접 보여준다는건 좀.. 아니다..
에러페이지가 너무 성의없는 페이지로 보인다.
개발자가 만들어놓은 에러페이지를 보여주는 방법을 알아보자..
<참고>
과거에는 web.xml이라는 파일에 에러페이지를 등록했다..
서블릿 에러페이지 등록해보기 (스프링 부트가 제공하는 기능을 사용)
스프링 빈으로 해당 객체를 등록해준다.
WebServerFactoryCustomizer 를 상속받아 구현하면 된다.
ErrorPage 객체를 생성하여 factory에 담아준다.
컨트롤러에서 response.sendError(404) 를 호출 했다면..
위 케이스에서는 /error-page/400 컨트롤러를 호출 하게 되며..
컨트롤러에서 RuntimeException 또는 그 자식타입의 예외가 발생했었다면...
/error-page/500 컨트롤러가 호출 된다.
-> 결국 WAS까지 예외가 던져 지거나 정상적으로 return 된 경우엔 WAS sendError가 호출된 사실을 파악한 후,
WebServerCustomizer 클래스에서 정의한 컨트롤러를 다시 호출 하게된다..
-> 그러면.. 개발자는 /error-page/500 과 같은 url 을 처리할 컨트롤러를 만들어주고
그 컨트롤러에서 개발자가 보여주고 싶은 에러페이지 뷰를 응답 할 수 있도록 하면 된다!
개발자가 만든 에러페이지가 호출 되기까지의 흐름
1. WAS -> 필터 -> DispatcherServlet(서블릿) -> 인터셉터 -> 컨트롤러
2. 컨트롤러에서 sendError 호출 또는 일반 예외가 발생
3. 컨트롤러 -> 인터셉터 -> 서블릿 -> 필터 -> WAS
4. WAS에서 개발자가 정의한 url로 요청이 온것처럼 한다.
5. WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 -> 개발자가 정의한 에러페이지 뷰 응답!참고로 클라이언트는 서버 내부에서, WAS -> 컨트롤러, 컨트롤러 -> WAS로 왔다 갔다하는걸 모른다...
WAS는 예외를 처리할때 단순히 새로운 컨트롤러를 호출하는게 아니라..
request.attribute에 다양한 정보를 추가 해준다..
아래는 key 이며, 개발자가 정의한 에러페이지를 보여주기 위한
컨트롤러에서 request.getAttribute(key) 로 받을 수 있다.
<key>
"javax.servlet.error.exception" //예외 (sendError의 경우 null)
"javax.servlet.error.exception_type" //예외 타입 (sendError의 경우 null)
"javax.servlet.error.message" //오류 메세지
"javax.servlet.error.request_uri" //클라이언트의 요청 URI (최초)
"javax.servlet.error.servlet_name" //오류가 발생한 서블릿 이름 (컨트롤러에서 발생했다면 DispatcherServlet이다.)
"javax.servlet.error.status_code" //Http status
'Spring > MVC' 카테고리의 다른 글
Spring MVC 마스터하기 예외처리 4 (0) 2022.06.11 Spring MVC 마스터하기 예외처리 3 (0) 2022.06.11 Spring MVC 마스터하기 예외처리 1 (0) 2022.06.11 Spring MVC 마스터하기 5 (0) 2022.06.04 Spring MVC 마스터하기 인터셉터 1 (0) 2022.06.04 다음글이전글이전 글이 없습니다.댓글