GlobalExceptionHandler - xx10222/selab-todo-list Wiki

Spring Boot에서 예외 처리를 하는 방법

  1. 전역 처리 - @ControllerAdvice
  2. 컨트롤러 단에서 처리 - @ExceptionHandler
  3. 메소드 단위 처리 - try/catch


GlobalExceptionHandler

Controller를 작성할 때 예외 상황을 고려하며 처리하는 작업이 늘어남에 따라, Spring MVC에서는 @ExceptionHandler@ControllerAdvice를 이용하여 처리하고 ResponseEntity를 이용하여 예외 메시지를 구성한다

@ExceptionHandler

  • @Controller@RestController가 적용된 Bean 내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 한다
  • Controller가 호출하는 Service에서 발생한 예외도 잡아낸다

@ControllerAdvice

  • AOP를 이용하여 공통적인 예외사항에 별도로 @ControllerAdvice를 이용하여 분리한다
  • @ExceptionHandler 가 하나의 클래스에 대한 것이라면, @ControllerAdvice 는 모든 @Controller, 즉 전역에서 발생할 수 있는 예외를 잡아주는 어노테이션이다
  • 여기서 @RestControllerAdvice 는 @ControllerAdvice와 같은 역할을 수행하며 @ResponseBody를 통해 객체를 리턴할 수도 있다
  • @ControllerAdvice는 해당 객체가 스프링 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도로 사용하고, @ExceptionHandler는 해당 메서드가 들어가는 예외 타입을 처리하는 것을 의미한다

Custom Exception : 사용자 정의 예외

표준 예외를 적극적으로 사용하자

  • 커스텀 예외의 이름만 봐도 어떤 예외인지 알아보기 좋다
  • 그러나 표준 예외를 사용하고 errorMessage 로 오류 상황을 나타내는 정도로도 충분히 표현이 가능하다면, 굳이 커스텀 예외를 사용하지 않는 것이 좋다
  • 반대로 CustomException을 받는 곳에서 처리하기 쉽도록 추가로 에러에 관한 정보를 넣어주거나, 여러 타입의 Exception이 발생할 수 있는 코드에서 한가지로 Exception 타이븡로 묶어 처리할 때는 custom exception을 사용할만 하다

표준 예외를 사용하면 가독성이 높아진다

  • NullPointerException : null을 허용하지 않는 메서드에 null을 건냈을 때
  • IndexOutBoundsException : 범위 밖의 index에 접근할 때
  • IllegalArgumentException : 허용하지 않는 값이 인수로 건네졌을 때
  • IllegalStateException : 객체가 메서드를 수행하기에 적절하지 않은 상태일 때
  • UnsupportedOperationException : 요청받은 작업을 지원하지 않는 경우 일 때

출처
https://w97ww.tistory.com/74 https://springboot.tistory.com/33

⚠️ **GitHub.com Fallback** ⚠️