Spring MVC 전역 컨트롤러
Spring Web MVC
백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글
@(Rest)ControllerAdvice
복습할 겸 지난 시간에 배웠던 @ExceptionHandler와 @ModelAttribute, @initBinder에 대해서 이야기해보자.
@ModelAttribute는 컨트롤러 안에서 모든 핸들러들이 사용할 공통의 Model 객체를 정의할 때 사용한다.
@InitBinder는 컨트롤러 안에서 핸들러들이 어떤 값을 바인딩할 때 Validator를 추가하거나 커스텀한 바인딩 로직을 추가할 수 있는 바인더였다.
@ExceptionHandler 역시 해당 컨트롤러 안에서 발생하는 에러를 처리할 때 사용할 수 있었다.
그런데 위의 세 애노테이션의 공통점은 현재 컨트롤러 내에서라는 조건이 붙는다.
만약 모든 컨트롤러에서 적용되도록 확대하려면 어떻게 해야할까?
이때 사용할 수 있는 것이 @(Rest)ControllerAdvice
이다.
@ControllerAdvice
public class BaseController {
@ExceptionHandler
...
@InitBinder
...
@ExceptionHandler
...
}
위와 같이 ControllerAdvice
가 붙은 컨트롤러는 전역 컨트롤러가 된다.
여기에 선언된 예외처리, 바인딩, 모델 객체들은 모든 컨트롤러에서 공통으로 사용할 수 있다.
만약 특정 컨트롤러에만 적용하고 싶은 경우라면?
당연히 적용할 범위를 지정하는 것 또한 가능하다.
@ControllerAdvice(assignableTypes = {EventController.class, EventApi.class})
public class BaseController {
@ExceptionHandler
...
@InitBinder
...
@ExceptionHandler
...
}
위와 같이 적용할 클래스를 명시해줄 수 있다.
Reference
인프런 백기선님의 스프링 Web MVC