SpringMVC 활용 - 추가내용
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
- ex)
- 리턴하는 객체를 모델에 넣어주고, 요청이름과 동일한 이름의 view를 찾는다.
- RequestToViewNameTranslator
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})
- 특정 어노테이션