-
@ControllerAdvice와 @ExceptionHandlerJava/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")
'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 댓글