티스토리 뷰

Spring

[Spring]@InitBinder란?

Xion 2020. 10. 10. 16:03

| @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";
	}
}

 

이런식으로 공백이 들어있다면, 에러 메시지가 나옵니다.