@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {}
@RequestMapping
public ResponseEntity> error(HttpServletRequest request) {}
}
이 표현식은 Spring의 Property Placeholder Syntax입니다.
${...}: 프로퍼티 값을 참조합니다. (프로퍼티=application.properties):: 기본값(default)을 정의할 때 사용합니다.${server.error.path}server.error.path라는 프로퍼티를 찾습니다.${error.path}server.error.path가 정의되지 않은 경우, 대신 error.path를 찾습니다./error (기본값)/error를 사용합니다.Spring Boot의 예외 처리 엔드포인트(error path)를 정의합니다.
"/error" URL로 매핑된 컨트롤러를 통해 에러를 처리합니다.application.properties 또는 application.yml에서 server.error.path나 error.path 값을 설정하면, 이 기본 경로를 커스터마이징할 수 있습니다.@RequestMapping("${server.error.path:${error.path:/error}}")
server.error.path 프로퍼티가 정의되어 있다면 그 값을 사용합니다.error.path 프로퍼티를 찾습니다."/error"를 사용하여 요청을 처리합니다.오류가 발생했을 때 오류 페이지로 /error를 기본 요청한다. 스프링 부트가 자동 등록한 BasicErrorController는 이 경로를 기본으로 받는다.
@Controller
public class ServletExController {
@GetMapping("/error-ex")
public void errorEx() {
throw new RuntimeException("예외 발생!");
}
@GetMapping("/error-404")
public void error404(HttpServletResponse response) throws IOException {
response.sendError(404, "404 오류!");
}
@GetMapping("/error-500")
public void error500(HttpServletResponse response) throws IOException {
response.sendError(500);
}
}
resources/templates/error/4xx.html
resources/templates/error/404.html
resources/templates/error/500.html
결과
http://localhost:8080/error-404 -> 404.html
http://localhost:8080/error-400 -> 4xx.html (400 오류 페이지가 없지만 4xx가 있음)
http://localhost:8080/error-500 -> 500.html
http://localhost:8080/error-ex -> 500.html (예외는 500으로 처리)
스프링 부트가 제공하는 BasicErrorController 는 HTML 페이지를 제공하는 경우에는 매우 편리하다. 4xx, 5xx 등등 모두 잘 처리해준다. 그런데 API 오류 처리는 다른 차원의 이야기이다. API 마다, 각각의 컨트롤러나 예외마 다 서로 다른 응답 결과를 출력해야 할 수도 있다. 예를 들어서 회원과 관련된 API에서 예외가 발생할 때 응답과, 상품과 관련된 API에서 발생하는 예외에 따라 그 결과가 달라질 수 있다. 결과적으로 매우 세밀하고 복잡하다. 따라서 이 방법 은 HTML 화면을 처리할 때 사용하고, API 오류 처리는 뒤에서 설명할 @ExceptionHandler 를 사용하자.