Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[API예외] @ControllerAdvice 본문

인프런/[인프런] 스프링 MVC 2

[API예외] @ControllerAdvice

Seung__ 2021. 10. 1. 20:18
  • @ExceptionHandler 를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만, 
  • 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다. 
  • @ControllerAdvice 또는 @RestControllerAdvice 를 사용하면 둘을 분리할 수 있다.

 

1.@ControllerAdvice


  • Controller에 있던 오류 처리 코드를 분리해 내자.
  • @RestControllerAdvice를 적용한 ExControllerAdvice 클래스를 생성하여 코드를 여기로 옮겨놓자.
  • 그러면 여러 controller에서 발생한 Exception을 ControllerAdvice에서 처리해줌.
@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(IllegalArgumentException.class)
    public ErrorResult illegalExHandler(IllegalArgumentException e){
        log.error("[exceptionHandler] ex", e);
        return new ErrorResult("BAD", e.getMessage());
    }

    @ExceptionHandler(UserException.class)
    public ResponseEntity<ErrorResult> UserExHandler(UserException e){
        log.error("[exceptionHandler] ex", e);
        ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
        return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST);
    }

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler
    public ErrorResult exHandler(Exception e){
        log.error("[exceptionHandler] ex", e);
        return new ErrorResult("EX","내무오류");
    }

}
  • ControllerAdvice 는 대상으로 지정한 여러 컨트롤러에 
  • @ExceptionHandler , @InitBinder 기능을 부여해주는 역할.
  • @ControllerAdvice 에 대상을 지정하지 않으면 모든 컨트롤러에 적용된다. (글로벌 적용)
  • @RestControllerAdvice 는 @ControllerAdvice 와 같고, @ResponseBody 가 추가되어 있다.
  • @Controller , @RestController 의 차이와 같다. : @ResponseBody있냐 없냐 차이

 

 

2. Controller대상 지정


  • Controller 지정
  • pacakage 지정
  • 여러 contoller 지정
// 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 {}

 

3. 정리


@ExceptionHandler 와 @ControllerAdvice 를 조합하면 예외를 깔~끔하게 해결 가능.

 

 

4. GitHub : 211001 @ControllerAdvice


 

 

GitHub - bsh6463/Exception

Contribute to bsh6463/Exception development by creating an account on GitHub.

github.com

 

Comments