728x90
- API 예외 처리도 스프링 부트가 제공하는 기본 오류 방식을 사용할 수 있다.
- BasicErrorController
public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties,
List<ErrorViewResolver> errorViewResolvers) {
super(errorAttributes, errorViewResolvers);
Assert.notNull(errorProperties, "ErrorProperties must not be null");
this.errorProperties = errorProperties;
}
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections
.unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
- errorHtml
- produces = MediaType.TEXT_HTML_VALUE
- 클라이언트 요청의 Accept 해더 값이 text/html 인 경우에는 errorHtml()을 호출해서 view를 제공한다
- error
- 그외 경우에 호출되고 ResponseEntity로 HTTP Body에 JSON 데이터를 반환한다
- 스프링 부트의 기본 설정은 오류 발생시 /error를 오류 페이지로 요청한다. BasicErrorController는 이 경로를 기본으로 받는다
- 스프링 부트는 BasicErrorController 가 제공하는 기본 정보들을 활용해서 오류 API를 생성해준다.
- 자세한 오류 설정
- server.error.include-binding-errors=always
- server.error.include-exception=true
- server.error.include-message=always
- server.error.include-stacktrace=always
- 해당 값을 설정 하면 더 자세한 오류를 볼 수 있지만 보안상 위험하므로 사용하지 않는다
- 자세한 오류 설정
HTML VS API
- BasicErrorController 를 확장하면 JSON 메시지도 변경할 수 있다.
- 그런데 API 오류는 조금 뒤에 설명할 @ExceptionHandler 가 제공하는 기능을 사용하는 것이 더 나은 방법이므로 지금은 BasicErrorController를 확장해서 JSON 오류 메시지를 변경할 수 있다 정도로만 이해해두자.
- 스프링 부트가 제공하는 BasicErrorController 는 HTML 페이지를 제공하는 경우에는 매우 편리하다. 4xx, 5xx 등등 모두 잘 처리해준다. 그런데 API 오류 처리는 다른 차원의 이야기이다. API 마다, 각각의 컨트롤러나 예외마다 서로 다른 응답 결과를 출력해야 할 수도 있다. 예를 들어서 회원과 관련된 API에서 예외가 발생할 때 응답과, 상품과 관련된 API에서 발생하는 예외에 따라 그 결과가 달라질 수 있다. 결과적으로 매우 세밀하고 복잡하다. 따라서 이 방법은 HTML 화면을 처리할 때 사용하고, API는 오류 처리는 뒤에서 설명할 @ExceptionHandler를 사용하자.
728x90
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch09. API 예외 처리 - 스프링이 제공하는 ExceptionResolver (0) | 2022.03.21 |
|---|---|
| Ch09. API 예외 처리 - HandlerExceptionResolver (0) | 2022.03.21 |
| Ch09. API 예외 처리 - API 예외 처리 시작 (0) | 2022.03.21 |
| Ch08. 예외 처리와 오류 페이지 - 스프링 부트(오류 페이지) (0) | 2022.03.20 |
| Ch08. 예외 처리와 오류 페이지 - 서블릿 예외 처리 (0) | 2022.03.20 |