Spring

[Spring] Exception (예외) - ExceptionHandler

동그리담 2024. 6. 27. 18:24

HTML 화면 오류 vs API 오류

HTML 화면 오류

웹 브라우저에 HTML 화면을 제공할 때는 오류가 발생하면 BasicErrorController 를 사용하는게 편하다. 
이때는 단순히 5xx, 4xx 관련된 오류 화면을 보여주면 된다. BasicErrorController 는 이런 메커니즘을 모두 구현해두었다.

 

API  오류 (API 예외처리의 어려운 점)

  • HandlerExceptionResolver 를 떠올려 보면 ModelAndView 를 반환해야 했다.
    • 이것은 API 응답에는 필요하지 않다.
  • API 응답을 위해서 HttpServletResponse 에 직접 응답 데이터를 넣어주었다. 
    • 이것은 매우 불편하다. 스프링 컨트롤러에 비유하면 마치 과거 서블릿을 사용하던 시절로 돌아간 것 같다.
  • 특정 컨트롤러에서만 발생하는 예외를 별도로 처리하기 어렵다. 
    • 예를 들어서 회원을 처리하는 컨트롤러에서 발생 하는 RuntimeException 예외와
      상품을 관리하는 컨트롤러에서 발생하는 동일한 RuntimeException 예외를 
      서로 다른 방식으로 처리하고 싶다면 어떻게 해야할까?

 

@ExceptionHandler

스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler 라는 애노테이션을 사용하는 매우 편리한 예외 
처리 기능을 제공하는데, 이것이 바로 ExceptionHandlerExceptionResolver 이다. 
스프링은 ExceptionHandlerExceptionResolver 를 기본으로 제공하고, 기본으로 제공하는 ExceptionResolver 중에 우선순위도 가장 높다. 

  • Controller 내부 메서드 사용
    • 상태변경 필요시 메서드 단계의 @ResponseStatus(상태지정) 하거나 ResponseEntity<객체>
    • @ExceptionHandler - 예외지정 : (예외.class) 애너테이션 정의 또는 메서드의 매개변수(파라미터)에 예외 정의
      1. 객체 반환 (상태 지정 필요시 @ResponseStatus 애너테이션 필요)
      2. ResponseEntity<객체> 반환 (상태지정 필요시)
    • 지정한 예외의 자식 클래스 모두 처리 가능 (우선순위 - 자식 클래스 우선)
    • 옵션 : {예외1.class,예외2.class} 매개변수 예외3 으로 한번에 다양한 예외 처리 가능

ExceptionHandler의 파라미터와 응답 목록 :
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-exceptionhandler-args

 

 

출처: https://tan-sog.tistory.com/90