본문 바로가기

스프링

[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을 뷰 이름으로 하여 리턴한다.

BasicErrorControllerController로 등록되어 ComponentScan시 자동으로 빈으로 등록된다.

그에 따라,우리가 해당 상태 코드에 맞는 html만 생성해준다면 Spring이 자동으로 렌더링해준다.

오류페이지 - 결과

  • 다음과 같이 이상한 URL을 치면 우리가 등록한 404 ERROR PAGE가 자동으로 뜬다.

이를 활용하여 다양한 상태코드에 대한 뷰를 생성할 수 있다.

API를 활용할 때는 어떻게 이러한 에러에 대응할 지 다음 포스팅에서 알아보자.

'스프링' 카테고리의 다른 글

[JPA] N+1 문제  (0) 2021.10.19
[Spring] API Exception (With Validation)  (0) 2021.09.27
[Spring] 필터, 인터셉터  (0) 2021.09.26
[Spring] 세션(Session)  (0) 2021.09.25
[Spring] 검증(Bean Validation)  (0) 2021.09.23