[Spring boot] API예외처리

SeoYoung Jung·2022년 5월 13일
0

오류 페이지에서 나아가 API 예외처리를 해야했다.

스프링부트에서는 예외처리를 위해 기본 오류 방식을 제공한다.

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

1.errorHtml() : produces = MediaType.TEXT_HTML_VALUE : 클라이언트 요청의 Accept 해더 값이
text/html 인 경우에는 errorHtml() 을 호출해서 view를 제공한다

2.error() : 그외 경우에 호출되고 ResponseEntity 로 HTTP Body에 JSON 데이터를 반환한다.

API 에러 = API 마다, 각각의컨트롤러나 예외마다 서로 다른 응답 결과를 출력한다.

컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경하고 싶으면?
=>ExceptionReslover

HandlerExceptionResolver 의 반환 값에 따른 DispatcherServlet 의 동작 방식

1.빈 ModelAndView: new ModelAndView() 처럼 빈 ModelAndView 를 반환하면 뷰를 렌더링 하지
않고, 정상 흐름으로 서블릿이 리턴된다.
2.ModelAndView 지정: ModelAndView 에 View , Model 등의 정보를 지정해서 반환하면 뷰를 렌더링
한다.
3. null: null 을 반환하면, 다음 ExceptionResolver 를 찾아서 실행한다. 만약 처리할 수 있는
ExceptionResolver 가 없으면 예외 처리가 안되고, 기존에 발생한 예외를 서블릿 밖으로 던진다

*ExceptionResolver 를 사용하면 컨트롤러에서 예외가 발생해도 ExceptionResolver 에서 예외를
처리해버린다.
따라서 예외가 발생해도 서블릿 컨테이너까지 예외가 전달되지 않고, 스프링 MVC에서 예외 처리는 끝이
난다.
결과적으로 WAS 입장에서는 정상 처리가 된 것이다. 이렇게 예외를 이곳에서 모두 처리할 수 있다는 것이
핵심이다

스프링이 제공하는 ExceptionResolver

andlerExceptionResolverComposite 에 다음 순서로 등록 (우선순위 순)

  1. ExceptionHandlerExceptionResolver
    @ExceptionHandler 을 처리한다. API 예외 처리는 대부분 이 기능으로 해결한다.

  2. ResponseStatusExceptionResolver

HTTP 상태 코드를 지정해준다.
예) @ResponseStatus(value = HttpStatus.NOT_FOUND)
3. DefaultHandlerExceptionResolver

HTTP 상태 코드를 지정해준다.
예) @ResponseStatus(value = HttpStatus.NOT_FOUND)

DefaultHandlerExceptionResolver
스프링 내부 기본 예외를 처리한다.

profile
뚱땅뚱땅개발자

0개의 댓글