프레임워크/Spring

[Spring] @ExceptionHandler와 @ControllerAdvice란 무엇인가?

멍토 2021. 4. 27.

우리는 기존에 에러를 핸들링 하기 위해서 try-catch를 사용했다.

Spring에서는 이러한 것을 편하게 해결하기 위해 지원가능 기능이 있는데 이것이 바로 @ExceptionHandler이다.

@Controller
public class SimpleController {

    // ...

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handle(IOException ex) {
        // ...
    }
}

해당 컨트롤러에서 비즈니스 로직을 수행하다가 CustomException이 발생하면 해당 애너테이션이 붙어있는 메서드가 실행되어 에러를 처리하게 된다.

여기서 추가적으로 Controller에서 작성하는 것이 아니라 분리를 해서 처리를 할 수 있는데 이럴때 도와주는 친구가 바로 @ControllerAdvice이다.

@ControllerAdvice
public class CustomAdvice {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException() {
        // ...
    }
}

위와 같은 방식으로 에러를 핸들링 하는 부분만 분리하여 사용할 수 있다.

위에서는 반환이 ResponseEntity타입으로 반환하기 때문에 ResponseBody를 붙이지 않아도 되지만 저렇게 처리하지 않는다면 Body를 포함해야 할때는 ResponseBody 혹은 RestControllerAdvice를 이용하면 된다.

그리고 위와같은 방식으로 사용하면 모든 컨트롤러에서 발생하는 에러를 처리하게 된다.

만약 좀 더 세밀하게 처리를 하고 싶다면 아래와 같은 방식으로 특정 클래스 혹은 특정 패키지에서 발생하는 에러만 처리할 수 있다.

// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}

// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}

// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-controller-advice

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-exceptionhandler

댓글

💲 광고입니다.