ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @ControllerAdvice와 @ExceptionHandler
    Java/Spring 2020. 7. 27. 18:04


    ■@ControllerAdvice란?


    Controller를 보조하는 어노테이션.


    Controller에서 쓰이는 공통 기능들을 모듈화하여 전역으로 쓰기 위해 사용.


    아래 3개의 어노테이션을 지원한다.


     @ExceptionHandler

     @ExceptionHandler 뒤에 붙은 Exception이 해당 @Controller에서 

    발생했을 때, 그 Exception에 대한 전역적인 예외 처리를 할 수 있게 한다.

     @InitBinder

     모델 검증과 바인딩을 하기 위한 어노테이션. 

    JSR-303 빈 검증기능을 사용하는 스프링 validator를 사용할 수 있다.

     @ModelAttribute

     도메인 오브젝트나 DTO프로퍼티에 요청 파라미터를 

    한 번에 받을 수 있는 @ModelAttribute를 전역으로 사용 가능하다.


    이 중 @ExceptionHandler가 가장 많이 사용된다.


    @ExceptionHandler는 해당 컨트롤러가 실행하고 있는 @Service 클래스 등 


    Bean 객체 내의 메소드에서 throw한 Exception에 대해서도 처리가 가능하다.

    @ControllerAdvice
    public class GlobalControllerAdvice {

    @ExceptionHandler(NullPointerException.class)
    public void nullPointerException(NullPointerException e) {
    //blabla
    }

    //...
    }
    @ControllerAdvice
    public class GlobalControllerAdvice {

    @InitBinder
    public void initBinder(DataBinder dataBinder){
    //...
    }
    }
    @ControllerAdvice
    public class GlobalControllerAdvice {

    @ModelAttribute
    public User user(@AuthenticationPrincipal User user) {
    return user;
    }
    }




    ■@ExceptionHandler


    컨트롤러 내 특정 Exception을 처리하기 위한 어노테이션.


    @Controller 클래스 내에서도 사용 가능하다. 


    하지만 특정 Exception들을 전역적으로 처리하기 위해, 


    대부분 @ControllerAdvice 클래스에서 활용된다.


    만약 @ExceptionHandler가 없다면, 각 Exception이 발생하는 지점에서


    try catch로 처리하거나 밖으로 throw 해야 한다.


    이는 중복되는 코드도 많아지고 관리 포인트도 많아진다.


    이 경우 Exception을 @ExceptionHandler를 사용하여 공통 로직에서 처리하면 편리하다.

    @ControllerAdvice
    public class ExceptionLowestControllerAdvice {
    @ExceptionHandler(Exception.class)
    public String handleAnyException(HttpServletRequest request, HttpServletResponse response, Exception e) {
    ExceptionDto exception = new ExceptionDto("Exception on server occurred", e.toString(), ExceptionType.SERVER);
    request.setAttribute("msg", exception.toString());

    return "forward:/handling";
    }
    }




    ■@ControllerAdvice vs @RestControllerAdvice


    @RestController와 마찬가지로


    @RestControllerAdvice도 @ControllerAdvice를 포함하고 있다.

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @ControllerAdvice
    @ResponseBody
    public @interface RestControllerAdvice {
    //...
    }

    ViewResolver를 통해서 예외 처리 페이지로 리다이렉트 시키려면 


    @ControllerAdvice만 써도 된다. 


    한편 Body에 오류 내용을 포함해 return 해야 한다면 


    @ResponseBody 어노테이션이 추가된 @RestControllerAdvice를 적용하면 된다.


    @Controller에서 예외가 발생하든 @RestController에서 예외가 발생하든


    @ControllerAdvice + @ExceptionHandler 으로 다 catch 할 수 있다.


    @ResponseBody의 필요 여부에 따라 @ControllerAdvice나 @RestControllerAdvice를 


    구분하여 적용하면 된다. 


    한편 아래처럼 패키지 단위로 ControllerAdvice를 적용할 수도있다.

    @RestControllerAdvice("com.example.demo.login.controller")


    https://5553.tistory.com/132


    https://jeong-pro.tistory.com/195

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

    Spring 어노테이션  (0) 2019.05.20
    xss  (0) 2019.05.07
    IOC (DI)  (0) 2019.04.06
    스프링이란  (0) 2019.04.06
    프레임워크vs라이브러리  (0) 2019.04.06

    댓글

Designed by Tistory.