API 예외처리 - 스프링 부트 기본 오류 처리

    스프링 부트가 제공하는 BasicErrorController를 살펴보자.

     

    @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);
    }
    
    @RequestMapping
    	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    		HttpStatus status = getStatus(request);
    		if (status == HttpStatus.NO_CONTENT) {
    			return new ResponseEntity<>(status);
    		}
    		Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
    		return new ResponseEntity<>(body, status);
    }

     

    /error 동일한 경로를 처리하는 errorHtml() , error() 두 메서드를 확인할 수 있다.

    • errorHtml() : produces = MediaType.TEXT_HTML_VALUE : 클라이언트 요청의 Accept 해더 값이 text/html 인 경우에는 errorHtml() 을 호출해서 view를 제공한다.
    • error() : 그외 경우에 호출되고 ResponseEntity 로 HTTP Body에 JSON 데이터를 반환한다.

    스프링부트의 예외 처리

    스프링 부트의 기본 설정은 오류 발생시 /error 를 오류 페이지로 요청한다.

    BasicErrorController 는 이 경로를 기본으로 받는다. ( server.error.path 로 수정 가능, 기본 경로 / error )

     

    스프링 부트는 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 를 사용하자.

     

     

    'SPRING' 카테고리의 다른 글

    스프링이 제공하는 ExceptionResolver  (1) 2023.12.28
    API 예외처리 - HandlerExceptionResolver  (1) 2023.12.27
    Bean Validation - 6 - HTTP 메시지 컨버터  (0) 2023.12.20
    Bean Validation - 5  (1) 2023.12.20
    Bean Validation - 4(groups)  (0) 2023.12.20

    댓글