스프링 MVC 활용(29) : 전역 컨트롤러 - @(Rest)ControllerAdvice

de_sj_awa·2021년 7월 4일
0
post-custom-banner

29. 전역 컨트롤러 - @(Rest)ControllerAdvice

예외 처리, 바인딩 설정, 모델 객체를 모든 컨트롤러 전반에 걸쳐 적용하고 싶은 경우에 사용한다.

  • @ExceptionHandler
  • @InitBinder
  • @ModelAttributes

적용할 범위를 지정할 수도 있다. (ControllerAdvice.java 참고)

  • 특정 애노테이션을 가지고 있는 컨트롤러에만 적용하기
  • 특정 패키지 이하의 컨트롤러에만 적용하기
  • 특정 클래스 타입에만 적용하기

@ControllerAdvice
public class BaseController {

    @ExceptionHandler({EventException.class, RuntimeException.class})
    public String eventErrorHandler(RuntimeException exception, Model model){
        model.addAttribute("message", "runtime error");
        return "error";
    }

    @InitBinder("event")
    public void initEventBinder(WebDataBinder webDataBinder){
        webDataBinder.setDisallowedFields("id");
        webDataBinder.addValidators(new EventValidator());
    }

    @ModelAttribute
    public void categories(Model model){
        model.addAttribute("categories", List.of("study", "seminar", "hobby", "social"));
    }
}

특정 컨트롤러에만 적용하고 싶은 경우

@ControllerAdvice(assignableTypes = {EventController.class, EventApi.class})
public class BaseController {

    @ExceptionHandler({EventException.class, RuntimeException.class})
    public String eventErrorHandler(RuntimeException exception, Model model){
        model.addAttribute("message", "runtime error");
        return "error";
    }

    @InitBinder("event")
    public void initEventBinder(WebDataBinder webDataBinder){
        webDataBinder.setDisallowedFields("id");
        webDataBinder.addValidators(new EventValidator());
    }

    @ModelAttribute
    public void categories(Model model){
        model.addAttribute("categories", List.of("study", "seminar", "hobby", "social"));
    }
}

시간 관계 상 살펴보지 못한 내용

  • 비동기 요청 처리
  • CORS 설정
  • HTTP/2
  • 웹 소켓
  • 웹 플럭스
  • ...

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글