[Spring] 오류 페이지
오류페이지란?
우리는 클라이언트 혹은 서버에서 잘못된 요청 혹은 응답을 할 경우 오류페이지를 보게된다.
우리가 흔히 볼 수 있는 예를 들면 400 Bad Request, 404 Not Found, 500 Internal Server Error 등이 존재한다.
그 중 우리가 가장 흔히 볼 수 있는 404 Not Found를 예로하여 이를 살펴보자.
우리가 개발중인 웹에서는 /qwe라는 API를 지원하지 않는다.
그런데, 우리가 이를 호출하게 되면 당연히 이에 대한 처리를 찾을 수 없어 404 Not Found를 내보낼텐데 이를 클라이언트 사용자에게 명시해줘야한다.
이게 어떻게 가능한 일일까?
이는 BasicErrorController에서 처리해준다.
이에 대해 자세히 살펴보자.
오류페이지 - BasicErrorController
HTTP 요청에서 요청에 대한 결과 즉, ACCEPT로 HTML을 요구할 수도 있고 JSON을 요구할 수도 있다.
이를 Spring에서는 처리해줘야하기 때문에 각각에 대해 나누어 놓았다.
- text/html을 요구했을 때의 처리 메소드이다.
- 웹 MVC에서 자주 사용한다.
- application/json을 요구했을 때의 처리 메소드이다.
- API 호출 방식을 진행할 때 자주 사용한다.
이번 포스팅에서는 HTML을 요구할 때의 상황에 대해서 자세히 살펴보자.
(1) errorHtml
- request, response, status 등의 정보를 활용하여 Error View를 구성해준다.
(2) resolveErrorView
- 등록된 resolver들을 기반으로 resolveErrorView메소드를 실행하여 실제로 ModelAndView를 처리한다.
(3) DefaultErrorViewResolver
- 기본 오류 페이지를 생성하는 것은 ErrorViewResolver를 상속하는 DefaultErrorViewResolver이다.
- 여기서는 미리 클라이언트의 오류 상태코드인 400대를 모두 포괄하는 4xx, 서버의 오류 상태코드인 500대를 모두 포괄하는 5xx를 미리 맵에 넣어둔다.
(4) DefaultErrorViewResolver - resolveErroView
- 상태코드를 기반으로 ModelAndView를 찾는다.
(5) DefaultErrorViewResolver - resolve
- 기본적으로 error/폴더에서 이를 찾아본다.
- resolveResource를 통해 리소스를 찾는다.
(6) DefaultErrorViewResolver - resolveResource
- 해당 위치에서 상태코드를 기반으로 찾는다.
- 상태코드 이름과 일치하는 html파일이 없다면, 4xx, 5xx와 같은 포괄적인 네이밍으로 찾는다.
- 있다면, 해당이름으로된 ModelAndView를 리턴하고 없다면 null을 리턴한다.
(7) errorHtml - 반환
- 있다면 만들어진 ModelAndView를 리턴한다.
- 없다면, 스프링에서 기본적으로 제공하는 error을 뷰 이름으로 하여 리턴한다.
이 BasicErrorController는 Controller로 등록되어 ComponentScan시 자동으로 빈으로 등록된다.
그에 따라,우리가 해당 상태 코드에 맞는 html만 생성해준다면 Spring이 자동으로 렌더링해준다.
오류페이지 - 결과
- 다음과 같이 이상한 URL을 치면 우리가 등록한 404 ERROR PAGE가 자동으로 뜬다.
이를 활용하여 다양한 상태코드에 대한 뷰를 생성할 수 있다.
API를 활용할 때는 어떻게 이러한 에러에 대응할 지 다음 포스팅에서 알아보자.