-
[Spring Boot] @RestControllerAdvice를 이용해서 예외 처리 핸들링하기SpringBoot Meteor 2021. 12. 29. 16:27
@ControllerAdvice란?
간단하게 말해서 @ExceptionHandler, @ModelAttribute, @InitBinder가 적용된 메서드들을 AOP를 적용해 사용하기 위한 어노테이션
클래스에 선언해주면 되며, 모든 @Controller에 대한, 전역적으로 발생할 수 있는 예외를 잡아서 처리할 수 있다.
@RestControllerAdvice란?
@ResponseBody + @ControllerAdvice ⇒ @RestControllerAdvice
@ControllerAdvice와 동일한 역할을 수행하고, 추가적으로 @ResponseBody를 통해 객체를 리턴할 수도 있다.
- 단순히 예외만 처리 하고 싶을 때 → @ControllerAdvice를 사용
- 예외처리 후 객체를 응답하고 리턴해주고 싶으면 @RestControllerAdvice를 적용하면 됨. → 이렇게 하면 커스텀 한 후 일반 컨트롤러에서도 script message를 보내주고싶은 경우 script를 Data로 보내줄 수 있다
- 두 어노테이션 모두 적용 범위를 클래스나 패키지 단위로 제한할 수도 있으며, 아래와 같이 사용하면 된다.
@RestcontrollerAdvice(basePackagClasses = TestException.calss) // 적용 범위 : 클래스 @RestControllerAdvice(basePackges = "com.app.exceptiontest")
우선 MyCustomException 이라는 간단한 예외를 만든다.
public class MyCustomException extends RuntimeException{ public MyCustomException() { super("Hello, MyCustomExceptionException!"); } }
- RuntimeException : Exception을 커스텀할 수 있게 상속을 받는다.
예외를 던질 컨트롤러를 만든 후 위에서 만든 커스텀익셉션 예외를 발생시켜 준다.
@RestController public class HelloRestController { @GetMapping("/myException") public void throwException() { throw new MyCustomException(); } }
- throw를 이용해 Exception을 발생시켜준다.
예외 처리 메서드를 작성할 익셉션커스텀 핸들러를 만든다.
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice(annotations = RestController.class) public class MyCustomExceptionControllerAdvice { @ExceptionHandler(MyCustomException.class) public String errorHandler(MyCustomException e) { return e.getMessage(); } }
- @RestControllerAdvice 에 annotations 속성에 컨트롤러 클래스를 인수로 주면 적용되는 범위를 해당 컨트롤러 클래스로 한정할 수 있다. 아무런 값도 주지 않으면 전역적으로 작동 함.
- @ExcepionHandler 메서드에 타겟이 되는 예외를 파라미터로 넘겼습니다. 타겟 예외가 발생되면 이 메서드가 호출 됨. 간단하게 예외 메세지가 반환되도록 해본다.
- 괄호에는 핸들링할 익셉션 클래스를 정의해준다(특정 예외 클래스를 지정해주면 해당 예외가 발생했을 때 메서드에 정의한 로직으로 처리 가능)
- @ControllerAdvice 또는 @RestControllerAdvice에 정의된 메서드가 아닌 일반 컨트롤에 존재하는 메서드에 선언할 경우에는 해당 Controller에만 적용 됨!
Controller, RestController에만 적용이 가능하다(@Service 등의 빈에서는 사용 안됨..)
하나의 익셉션핸들링 메서드로 여러개의 익셉션을 핸들링 하고싶으면
@ExceptionHandler(value = {MyCustomException.class, MyCustomException2.class}) public String errorHandler(RuntimeException e) { return e.getMessage(); }
value에 핸들링할 클래스들을 정의 해준다. 이 value 값들은 ExceptionHandler의 매칭 스코프를 정의해준다.
- 메서드의 파라미터는 MyCustomException와 MyCustomException2이 RuntimeException을 상속받고있으므로 부모타입인 RuntimeException타입으로 받아준다. (상속과 다형성 특징 이용)
'SpringBoot Meteor' 카테고리의 다른 글
[Spring Boot] AOP pointcut post, put 어노테이션에 적용하기 (pointcut 여러개) (0) 2021.12.29 [Spring Boot] Objects.requireNonNull 메서드 (0) 2021.12.29 [Spring Boot] JWT (JSON WEB TOKEN) 간단 정리 (0) 2021.12.23 [Spring Boot] 시큐리티 회원가입시 추가정보 미기입 상태 분기처리 (0) 2021.12.23 [Spring Boot] Spring Security 시큐리티 권한 업데이트 시 동적 적용 (0) 2021.12.21