Exceptions

Dev.Hammy·2024년 3월 26일
0

반응형 스택에서 이에 상응하는 내용 보기

요청 매핑 중에 예외가 발생하거나 요청 핸들러(예: @Controller)에서 발생하는 경우 DispatcherServlet은 예외를 resolve하고 대체 처리(일반적으로 오류 응답)를 제공하기 위해 HandlerExceptionResolver 빈 체인에 위임합니다.

다음 표에는 사용 가능한 HandlerExceptionResolver 구현이 나열되어 있습니다.

표 1. HandlerExceptionResolver 구현체
HandlerExceptionResolver 설명

SimpleMappingExceptionResolver

예외 클래스 이름과 오류 뷰 이름 간의 매핑. 브라우저 애플리케이션에서 오류 페이지를 렌더링하는 데 유용합니다.

DefaultHandlerExceptionResolver

Spring MVC에서 발생한 예외를 resolve하고 HTTP 상태 코드에 매핑합니다. 대안으로 ResponseEntityExceptionHandler에러 응답도 참고하십시오.

ResponseStatusExceptionResolver

@ResponseStatus 주석을 사용하여 발생한 예외를 resolve하고 주석의 값에 따라 HTTP 상태 코드에 매핑합니다.

ExceptionHandlerExceptionResolver

@Controller 또는 @ControllerAdvice 클래스의 @ExceptionHandler 메서드를 호출하여 예외를 resolve합니다. @ExceptionHandler 메서드를 참조하십시오.

Chain of Resolvers

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를 자동으로 선언합니다. 해당 목록을 사용자 정의하거나 바꿀 수 있습니다.

Container Error Page

예외가 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을 모두 사용할 수 있습니다.

0개의 댓글