@ExceptionHandler

2020. 4. 26. 16:55Java/Spring

1. @ExceptionHandler

 @ExceptionHandler는 @Controller, @RestController가 적용된 빈에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 합니다.

@RestController 
public class MyRestController { 
    @ExceptionHandler(NullPointerException.class) 
    public Object nullex(Exception e) {
         System.err.println(e.getClass()); return "myService";
     }
}

 위와 같이 @ExceptionHandler를 쓰고 캐치하고 싶은 예외 클래스를 인자로 등록해주면 사용할 수 있습니다. 예제와 같이 사용한다면 MyRestController에 해당하는 빈에서 NullPointerException이 발생하면 @ExceptionHandler가 적용된 메서드가 호출될 것입니다.

주의사항

  • @Controller, @RestController에만 적용할 수 있습니다. (@Service, @Component는 안 됨)
  • 리턴 타입은 자유롭게 설정할 수 있습니다. 에러가 발생할 수 있는 메소드와 다른 리턴 타입이어도 상관없습니다.
  • @ExceptionHandler를 등록한 Controller에만 적용됩니다.
  • 메소드의 파라미터 또한 자유롭게 설정할 수 있습니다.
  • @ResponseStatus를 이용해 HTTP 상태코드를 리턴하지 않으면, HTTP 상태 코드를 모두 200으로 리턴합니다.

2. @ControllerAdvice

 @ControllerAdvice는 @Controller로 등록된 빈에서 발생한 모든 Exception을 처리해주는 기능을 합니다.

@ControllerAdvice
public class GlobalExceptionHandler { 
    @ExceptionHandler(NullPointerException.class) 
    public Object nullex(Exception e) {
         System.err.println(e.getClass());
     }
}

 위의 예제처럼 쓴다면 어느 Controller에서 NullPointerException이 발생하면 예제에 선언된 메소드에서 처리됩니다.

3. @RestControllerAdvice

 @RestControllerAdvice는 @RestController로 등록된 빈에서 발생한 모든 Exception을 처리해주는 기능을 합니다.

@RestControllerAdvice
public class GlobalExceptionHandler { 
    @ExceptionHandler(NullPointerException.class) 
    public Object nullex(Exception e) {
         System.err.println(e.getClass());
     }
}

위의 예제처럼 쓴다면 어느 RestController에서 NullPointerException이 발생하면 예제에 선언된 메소드에서 처리됩니다.

728x90

'Java > Spring' 카테고리의 다른 글

Transaction Template  (1) 2020.05.07
Spring Singleton  (0) 2020.05.01
AOP  (0) 2020.04.18
@Transactional  (0) 2020.04.17
Spring DI 방법  (0) 2020.03.27