요청 매핑 중에 예외가 발생하거나 요청 핸들러(예: @Controller
)에서 발생하는 경우 DispatcherServlet
은 예외를 resolve하고 대체 처리(일반적으로 오류 응답)를 제공하기 위해 HandlerExceptionResolver
빈 체인에 위임합니다.
다음 표에는 사용 가능한 HandlerExceptionResolver
구현이 나열되어 있습니다.
HandlerExceptionResolver |
설명 |
---|---|
|
예외 클래스 이름과 오류 뷰 이름 간의 매핑. 브라우저 애플리케이션에서 오류 페이지를 렌더링하는 데 유용합니다. |
Spring MVC에서 발생한 예외를 resolve하고 HTTP 상태 코드에 매핑합니다. 대안으로 |
|
|
|
|
|
Spring 구성에서 여러 HandlerExceptionResolver
빈을 선언하고 필요에 따라 order
속성을 설정하여 예외 해결 프로그램 체인을 형성할 수 있습니다. order 속성이 높을수록 예외 resolver 프로그램이 더 늦게 배치됩니다.
HandlerExceptionResolver
의 계약은 다음을 반환할 수 있다고 지정합니다.
error view를 가리키는 ModelAndView
resolver 내에서 예외가 처리된 경우 빈(empty) ModelAndView
입니다.
예외가 resolve되지 않은 상태로 남아 있으면 null
이며, 후속 rewolver가 시도하고, 예외가 끝에 남아 있으면 서블릿 컨테이너까지 bubble up될 수 있습니다.
bubble up
"bubble up"은 일반적으로 어떤 것이 계층 구조나 다른 형태의 구조 안에서 상위로 올라가거나 전파되는 것을 의미합니다. 이 맥락에서는 예외가 하위 수준의 처리기에서 해결되지 않으면, 그 예외가 상위 수준으로 전파되어 더 높은 수준의 처리기나 최종적으로는 Servlet 컨테이너로 전달되는 것을 의미합니다.
MVC 구성은 기본 Spring MVC 예외, @ResponseStatus
어노테이션 예외 및 @ExceptionHandler
메서드 지원을 위한 내장 resolver를 자동으로 선언합니다. 해당 목록을 사용자 정의하거나 바꿀 수 있습니다.
예외가 HandlerExceptionResolver
에 의해 resolve되지 않은 상태로 남아 전파되도록 남겨지거나 응답 상태가 오류 상태(즉, 4xx, 5xx)로 설정된 경우 서블릿 컨테이너는 HTML에서 기본 오류 페이지를 렌더링할 수 있습니다. 컨테이너의 기본 오류 페이지를 사용자 정의하려면 web.xml
에서 오류 페이지 매핑을 선언하면 됩니다. 다음 예에서는 그 방법을 보여줍니다.
<error-page>
<location>/error</location>
</error-page>
앞의 예에서 예외가 발생하거나 응답에 오류 상태가 있으면 서블릿 컨테이너는 컨테이너 내에서 구성된 URL(예: /error
)에 ERROR 디스패치를 만듭니다. 그런 다음 이는 DispatcherServlet
에 의해 처리되어 @Controller
에 매핑될 수 있습니다. 이는 다음 예제와 같이 모델과 함께 오류 뷰 이름을 반환하거나 JSON 응답을 렌더링하도록 구현될 수 있습니다.
@RestController
public class ErrorController {
@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
map.put("status", request.getAttribute("jakarta.servlet.error.status_code"));
map.put("reason", request.getAttribute("jakarta.servlet.error.message"));
return map;
}
}
Tip
Servlet API는 Java에서 오류 페이지 매핑을 생성하는 방법을 제공하지 않습니다. 그러나WebApplicationInitializer
와 최소web.xml
을 모두 사용할 수 있습니다.