- [Spring]@InitBinder란? 목차
| @InitBinder란?
" Spring Validator를 사용 시 @Valid 어노테이션으로 검증이 필요한 객체를 가져오기 전에 수행할 method를 지정해주는 어노테이션이다."
기존에 @Valid OR @Validated 애노테이션으로 데이터 검증을 위해 Validator interface를 구현한 class를 만들고 validate() 메소드를 직접 호출해 사용했는데, 이번에는 @InitBinder 어노테이션으로 직접 호출하지 않고 스프링 프레임 워크에서 호출하는 방법에 대해서 알아보겠습니다.
Ex 01)
StrudentController에서 활용
@Controller
pulbic calss StudentController {
@RequestMapping("/studentForm")
public String studentForm(){
return "studnetPage";
}
@RequestMapping("/studnet/create")
public String studnetCreate(@ModelAttribute("student") @Valid Student st, BindingResult result){
String page = "createDonePage";
//기존 validator를 통한 validate() 메서드 주석처리
//StudnetValidator validator = new StudentValidator();
//validator.validate(studnet,result);
if(result.hasError()){
page = "createPage";
}
return page;
}
//InitBinder 활용
@InitBinder
protected void initBinder(WebDataBinder binder){
//WebDataBinder를 활용한 ssetValidator() 메서드로 studentValidaotr() class를 넘김 검증을 위해
binder.setValidator(new StudentValidator());
}
}
- 유효성 검사가 필요한 커맨드 객체인 Studnet 객체 앞에 @Valid 어노테이션을 붙여줍니다.
- @InitBinder 어노테이션을 가진 메서드의 WebDataBinder 객체를 이용하여 setValidator() 메서드를 호출합니다.
(* 여기서 WebDataBinder란 ?
- 커맨드 객체를 바인딩 하는 객체입니다.
즉, setValidator() 메서드를 통하여 StudnetValidator 객체를 set해준다는 의미입니다. 즉 데이터 검증을 하겠다는 의미로 생각하시면 됩니다.
- 따라서, 주석처리한 validator 객체를 사용할 필요가 없습니다.
- 기존에 validate() 메서드를 호출하지 않아도 @InitBinder 어노테이션이 붙은 메서드를 통하여 최초에
먼저 호출을 하여 data를 검증하기 때문입니다.
)
Ex 02)
고객 정보를 등록하는 form이 있다고 생각해보자.
해당 form의 필수 입력 조건들을 위해 bean class에 다음과 같이 선언해주자.
@Controller
@RequestMapping("/customer")
public class CustomerController {
// input 스트링으로 들어오는 String 데이터들의 white space를 trim해주는 역할을 한다.
// 모든 요청이 들어올때마다 해당 method를 거침 (node의 middleware 같은 것 )
@InitBinder
public void InitBinder(WebDataBinder dataBinder) {
StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(true);
dataBinder.registerCustomEditor(String.class, stringTrimmerEditor);
}
@RequestMapping("/showForm")
public String showForm(Model theModel) {
theModel.addAttribute("customer", new Customer());
return "customer-form";
}
@RequestMapping("/processForm")
public String processForm(@Valid @ModelAttribute("customer") Customer customer, BindingResult theBindingReuslt) {
System.out.println("customer lastname | " + customer.getLastName() + " |");
System.out.println("BindingResult | " + theBindingReuslt + " | ");
System.out.println("\n\n");
if( theBindingReuslt.hasErrors()) {
return "customer-form";
}
return "customer-confirmation";
}
}
이런식으로 공백이 들어있다면, 에러 메시지가 나옵니다.
'Spring' 카테고리의 다른 글
[spring]@SessionAttributes와 @SessionAttribute란?(장바구니, 회원가입 폼 예시) (0) | 2020.10.02 |
---|---|
[Spring]Custom Annotation(커스텀 애노테이션) (0) | 2020.09.30 |
[spring]RestTemplate란? (0) | 2020.08.13 |
[springSecurity]스프링 시큐리티 (0) | 2020.08.08 |
[springSecurity]스프링 시큐리티 (0) | 2020.08.08 |