Spring/MVC

SpringMVC 활용 - 추가내용

Bong Gu 2021. 10. 11. 19:49
728x90

Spring MVC

스프링 MVC 활용

모델 : @ModelAttribute

  • @ModelAttribute 의 다른 용법

    • @RequestMapping 을 사용한 핸들러 메소드의 아규먼트에 사용하기 (이미 확인한 방법)

    • @Controller 또는 @ControllerAdvice 를 사용한 클래스에서 모델 정보를 초기화 할 때, 사용한다.

      @ModelAttribute 
      public void subjects(Model model) { 
          model.addAttribute("subjects", List.of("study", "seminar", "hobby", "social")); 
      }
    • @RequestMapping 과 같이 사용하면 해당 메소드에서 리턴하는 객체를 모델에 넣어준다.

      • RequestToViewNameTranslator
        • 리턴하는 객체를 모델에 넣어주고, 요청이름과 동일한 이름의 view를 찾는다.
          • ex) @RequestMapping("/events/name") -> events/name.html

DataBinder : @InitBinder

  • 특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 사용

    @InitBinder 
    public void initEventBinder(WebDataBinder webDataBinder) { 
        webDataBinder.setDisallowedFields("id"); 
    }
    • 리턴타입은 항상 void

    • setDisallowedFields() : 바인딩을 하지 않을 필드 설정

    • addCustomFormatter() : 커스텀 포매터 추가

    • addValidators() : 커스텀 Validator 설정

    • 특정 모델 객체에만 바인딩 또는 Validaotr 설정을 하고 싶은 경우

      @InitBinder("event")
      public void initEventBinder(WebDataBinder webDataBinder) {
          webDataBinder.setDisallowedFields("id"); 
      }
      • "event" 이름의 모델이 있을때만 사용

예외 처리 핸들러 : @ExceptionHandler

  • 특정 예외가 발생한 요청을 처리하는 핸들러 정의

    @ExceptionHandler
    public String errorHandler(EventException exception, Model model) {
        model.addAttribute("message", "event Error");
      return "error";
    }
    • 지원하는 메소드 아규먼트 (해당 예외 객체, 핸들러 객체, ...)

    • REST API의 경우, 응답 본문에 에러에 대한 정보를 담아주고 상태코드를 설정하려면 ResponseEnitity를 주로 사용한다.

      @ExceptionHandler({EventException.class, RuntimeException.class})
      public ResponseEntity<Event> errorHandler(RuntimeException exception, Model model) {
          return ResponseEntity.badRequest().body("can't create event as ...");
      }
    • 가장 구체적인 Exception 타입이 매핑된다.

      • ex) RuntimeExceptionHandler, EventExceptionHandler 가 있다면 EventExceptionHandler에 매핑된다.

      • 어노테이션에 Exception 타입을 설정할 수 있다. 이런경우 매개변수에는 설정한 Exception 모두 받을 수 있는 타입이 설정 되어야한다.

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

참고


전역 컨트롤러 : @(Rest)ControllerAdvice

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

    • @ExceptionHandler

      @ControllerAdvice
      public class BaseController {
      
        @ExceptionHandler({EventException.class, RuntimeException.class})
        public String errorHandler(RuntimeException exception, Model model) {
          model.addAttribute("message", "event Error");
          return "error";
        }
      }
    • @InitBinder

    • @ModelAttributes

  • 적용할 범위를 지정할 수 도 있다.

    • 특정 어노테이션
      • @ControllerAdvice(annotations = RestController.class)
    • 특정 패키지 이하
      • @ControllerAdvice("org.example.controllers")
    • 특정 클래스 타입
      • @ControllerAdvice(assignableTypes = {EventController.class, EventApi.class})

참고


728x90