ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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타입으로 받아준다. (상속과 다형성 특징 이용)
Designed by Tistory.