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



© 2022. by minkuk

Powered by minkuk