복붙노트

[SPRING] 예외 처리를 위해 @ExceptionHandler 또는 HandlerExceptionResolver보다 @ControllerAdvice의 장점은 무엇입니까?

SPRING

예외 처리를 위해 @ExceptionHandler 또는 HandlerExceptionResolver보다 @ControllerAdvice의 장점은 무엇입니까?

Spring 3.2는 Spring MVC 애플리케이션에서 예외를 처리하기 위해 @ControllerAdvice 주석을 도입했다. 그러나이 버전 이전에는 Spring은 Spring MVC 애플리케이션에서 예외를 처리하기 위해 @ExceptionHandler 또는 HandlerExceptionResolver를 가졌다. 그렇다면 왜 Spring 3.2에서 예외 처리를 위해 @ControllerAdvice 주석을 도입 했습니까? Spring 3.2가 @ExceptionHandler 나 HandlerExceptionResolver의 한계를 다루거나 더 강력한 예외 처리를하기 위해 @ControllerAdvice 주석을 도입했다고 강력히 믿는다.

@ExceptionHandler에 비해 @ControllerAdvice의 이점이나 예외 처리를위한 HandlerExceptionResolver의 장점을 설명 할 수 있습니까?

해결법

  1. ==============================

    1.@ExceptionHandler는 컨트롤러 수준에서 작동하며 전체 컨트롤러가 아닌 특정 컨트롤러에서만 활성화됩니다.

    @ExceptionHandler는 컨트롤러 수준에서 작동하며 전체 컨트롤러가 아닌 특정 컨트롤러에서만 활성화됩니다.

    이렇게하면 응용 프로그램에서 throw 된 모든 예외가 해결됩니다. 표준 Spring 예외를 해당 HTTP 상태 코드로 해석하는 데 사용됩니다. 그것은 응답의 본문에 아무 것도 설정하지 않는다는 것을 의미합니다. 응답의 상태 코드를 매핑하지만 본문은 null입니다.

    @ControllerAdvice는 Spring MVC 애플리케이션에서 전역 오류 처리에 사용된다. 또한 응답 본문과 상태 코드를 완벽하게 제어 할 수있다.

  2. ==============================

    2.@ExceptionHandler는 컨트롤러에 대해 로컬입니다.이 컨트롤러의 예외 만 자신의 @ExceptionHandler로 라우팅됩니다.

    @ExceptionHandler는 컨트롤러에 대해 로컬입니다.이 컨트롤러의 예외 만 자신의 @ExceptionHandler로 라우팅됩니다.

    그러나 @ControllerAdvice는 전역 적입니다. 예외, 바인딩 등을 처리하는 중앙 집중식 방법을 사용할 수 있습니다. 정의 된 모든 컨트롤러에 적용됩니다.

  3. ==============================

    3.차이점은 다음과 같습니다. 예외 처리 코드를 구성해야한다면 두 프로젝트에서 사용할 수있는 @ExceptionHandler 주석을 사용해야합니다. 두 diff.ways :   1) 주석을 사용하고 각 컨트롤러 클래스의 동일한 컨트롤러에서 예외를 처리합니다.     예 :

    차이점은 다음과 같습니다. 예외 처리 코드를 구성해야한다면 두 프로젝트에서 사용할 수있는 @ExceptionHandler 주석을 사용해야합니다. 두 diff.ways :   1) 주석을 사용하고 각 컨트롤러 클래스의 동일한 컨트롤러에서 예외를 처리합니다.     예 :

    @RestController
    public class WSExposingController{
    
    @GetMapping("/getAllDetails/{/id}")
    public UserDetails myMethod(@PathVariable int id){
    UserDetails user = UserDetailsService.getUser(id);
    return user;
    }
    
    //To handle the exceptions which are resulting from this controller, I can declare an exceptionHandler specifically in the same class
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity handlerSameControllerExceptions(){
    return new ResponseEntity(null,HttpStatus.INTERNAL_SERVER_ERROR);
    
    }
    

    }

    2) 확장하는 새로운 클래스를 만들면     ResponseEntityExceptionHandler (SpringBoot 클래스) 그리고 만약에     @ControllerAdvice 그러면 해당 클래스가됩니다.      globalexceptionhandler는 모든 컨트롤러 클래스를 발생시키는 예외가 여기에서 처리 될 수 있다고 말합니다. 그리고 그것은 어떤 패키지에도 존재할 수 있습니다.      동일한 프로젝트에서

    @RestController
    @ControllerAdvice
    public class GlobalJavaExceptionHandler extends ResponseEntityExceptionHandler{
    
        @ExceptionHandler(Exception.class)
        public ResponseEntity handleDiffControllerExceptions(){
            return new ResponseEntity(null,HttpStatus.INTERNAL_SERVER_ERROR);
        }
    

    둘 다 코드에 존재하면 local과 global은 global보다 우선합니다.     이상적으로 두 번째 옵션은 각 컨트롤러 클래스에 코드를 추가 할 필요가 없으므로 더 좋은 옵션입니다. @ControllerAdvice가있는이 클래스는 컨트롤러에서 DAO 전체 코드 시작으로 발생하는 모든 예외에 대한 원 스톱 솔루션이 될 수 있습니다. 코드의 길이

  4. ==============================

    4.@ExceptionHandler는 로컬 레벨이나 글로벌 레벨에서 사용할 수 있습니다. 로컬 레벨은 컨트롤러 내에서이 주석을 사용하여 해당 컨트롤러 내에서만 예외를 처리하는 것을 의미합니다. 그 컨트롤러에 의해 던져지는 모든 에러는 그 @ExceptionHandler에 의해 잡힐 것입니다. 그러나 이것은 다른 컨트롤러에 비슷한 예외가있는 경우 해당 컨트롤러에서 해당 코드를 다시 로컬로 다시 작성해야한다는 것을 의미합니다.

    @ExceptionHandler는 로컬 레벨이나 글로벌 레벨에서 사용할 수 있습니다. 로컬 레벨은 컨트롤러 내에서이 주석을 사용하여 해당 컨트롤러 내에서만 예외를 처리하는 것을 의미합니다. 그 컨트롤러에 의해 던져지는 모든 에러는 그 @ExceptionHandler에 의해 잡힐 것입니다. 그러나 이것은 다른 컨트롤러에 비슷한 예외가있는 경우 해당 컨트롤러에서 해당 코드를 다시 로컬로 다시 작성해야한다는 것을 의미합니다.

    컨트롤러마다 이와 같은 스타일의 예외 처리를 반복하지 않기 위해 @ControllerAdvice라는 또 다른 주석을 사용하여 전역 레벨에서 @ExceptionHanlder를 작성할 수 있습니다.

    @ControllerAdvice는 예외 처리와 관련이 없으며 전역 수준에서 속성, 유효성 검사 또는 포맷터 바인딩 처리에도 사용됩니다. 예외 처리의 컨텍스트에서 @ControllerAdvice는 @Exceptionhandler 어노테이션을 사용하여 전역 수준에서 예외 처리를 수행하는 또 다른 방법 일뿐입니다.

    이제 HandlerExceptionResolver에 도달했습니다. 이것은 더 낮은 레벨의 인터페이스입니다. Spring은 이것에 대한 2 가지 구현을 제공한다.

    예 : 예외를 처리하고 예외 처리 전략을 선택하려면 주석을 통해 로컬 예외 처리 또는 전역 예외 처리 중 하나를 선택하는 방법을 고려해야합니다. HTTP 상태 코드를 제공해야하는 방법, @Response 엔티티 등으로 랩핑하는 방법, 처리기 페이지로 리디렉션하는 방법, 플래시 속성을 통해 데이터를 운반하거나 매개 변수를 가져 오는 방법 등 또는 어노테이션을 건너 뛰고 SimpleMappingExceptionResolver를 사용하고 특정 예외를 오류 처리기 페이지 URL에 매핑하기 시작하십시오.

    여기서 우리는이 단계에서 HandlerExceptionResolver의 하위 레벨을 고려하지 않을 것입니다. 우리는 더 높은 레벨에서 그 구현을 다루고 있고, 이러한 옵션을 기반으로 전략을 구축하기 때문입니다.

    @ControllerAdvice는 예외 처리를 위해 도입되지 않았으므로 @ExceptionHandler를 사용하여 예외를 전역 적으로 처리 할 수있는 메커니즘입니다. HandlerExceptionResolver는 구현이 @ResponseStatus 및 @Exceptionhandler 주석을 지원하는 데 도움이되는 인터페이스입니다. Spring 프레임 워크가 적절한 예외 처리를 제공하지 않기 때문에 MVC 시스템과 관련된 예외를 처리하고 싶지 않다면 말이다. 그래서 당신이 손에해야 할 일이 있다면, 컨트롤러가 잡히지 않을 잘못된 @Requestmapping 등과 관련된 이슈는 1 순위에 도달하지도 않았으므로 HandlerExceptionResolver의 구현이 유용 할 것입니다

  5. from https://stackoverflow.com/questions/35323174/what-are-the-advantages-of-controlleradvice-over-exceptionhandler-or-handlerex by cc-by-sa and MIT license