[Spring] @ModelAttribute와 WebDataBinder

[Spring] @ModelAttribute와 WebDataBinder

@ModelAttribute

적용 대상을 Model의 속성으로 자동 추가해주는 어노테이션 (Model에 자동 저장)

반환 타입 또는 컨트롤러 메서드의 매개변수에 적용 가능하다.

예제 1 - 매개변수

기존에는 브라우저의 요청 값을 매개변수로 받아서 Model 객체를 통해서 매개변수를 저장했었다.

@RequestMapping("/testMVC") public String main(User user, Model model) { // 매개변수로 받은 user 객체를 Model에 저장 model.addAttribute("user", user); // 작업 결과를 보여줄 뷰의 이름을 반환 return "userInfo"; }

Model에 저장하고자 하는 매개변수 앞에 @ModelAttribute를 붙이면 model.addAttribute메서드에 저장하지 않고도 결과를 보여줄 페이지에서 매개변수를 사용할 수 있다.

@RequestMapping("/testMVC") // public String main(@ModelAttribute("user") User user) { public String main(@ModelAttribute User user) { // 위와 동일 // 매개변수로 받은 user 객체를 Model에 저장 //model.addAttribute("user", user); // 작업 결과를 보여줄 뷰의 이름을 반환 return "userInfo"; }

예제 2 - 반환타입

@RequestMapping("/testMVC") public String main(@ModelAttribute User user) { //String userInfo = getUserInfo(user); // 매개변수로 받은 user 객체를 Model에 저장 //model.addAttribute("user", user); // 작업 결과를 보여줄 뷰의 이름을 반환 return "userInfo"; } private @ModelAttribute("userInfo") String getUserInfo(User user) { return user.toString(); }

유저의 정보를 toString으로 보여주는 getUserInfo 메서드의 반환타입 앞에 @ModelAttribute를 적으면 결과를 model에 자동으로 저장시켜준다.

예제 3 - 생략 가능 여부

참조형 매개변수 앞에는 @ModelAttribute를 생략하고 사용할 수 있다.

@RequestMapping("/testMVC") public String main(User user, Model model) { // 매개변수로 받은 user 객체를 Model에 저장 // model.addAttribute("user", user); 참조형 매개변수는 바로 model에 저장된다. // 작업 결과를 보여줄 뷰의 이름을 반환 return "userInfo"; }

WebDataBinder

브라우저를 통해서 요청받은 값이 실제 서버의 객체에 바인딩 될 때 중간 역할을 한다. 크게 두 가지 작업을 진행한다.

먼저 타입 변환을 해주고 그 후 데이터 검증을 실시 한다. 변환 결과나 에러는 BindingResult에 저장한다.

WebDataBinder의 역할

예제

@ExceptionHandler public String error(Exception exception, BindingResult result) { exception.printStackTrace(); FieldError error = result.getFieldError(); System.out.println(error.getField()); System.out.println(error.getDefaultMessage()); return "errorPage"; } @RequestMapping("/testMVC") public String main(@ModelAttribute User user) { // 작업 결과를 보여줄 뷰의 이름을 반환 return "userInfo"; }

BindingResult 객체를 통해 에러객체를 받을 수 있고 에러 정보를 확인할 수 있다.

from http://byungmin.tistory.com/68 by ccl(A) rewrite - 2021-12-31 13:28:11