ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - Validator 커스터마이징
    Spring/Spring MVC 2022. 1. 3. 21:31
    728x90
    반응형

    Validator 커스터마이징

    • 라이브러리를 사용하지 않고 개발자가 필요한 Validator을 만들어보자.
    • 지금까지 유효성 검사는 Hibernate를 이용하였었다.
    • JSR-303, JSR-380 에 필요한 Validator가 없을 때 추가적으로 유효성 검사 조건이 필요할 경우 만든다.

     

     우선 error_message.properties를 Message로 등록을 하고 DataBean1을 만들어준다.

    Mesage 등록은 이전 게시판 참고하길 바란다.

    DataBean1의 property에 어니 테이션 없이 Validator 커스터마이징으로 유효성 검사를 해보자.

     

    public class DataBean1 {
    
    	@Size(min=2, max=10)
    	private String data1;
    	
    	private String data2;
    	
    	private String data3;
    
    	// ....setter, getter....
    	
    }

     위 data2, data3 2개의 프로퍼티는 Validator 커스터마이징으로 유효성 검사


     

     

    Validator 인터페이스 상속받는 클래스 구현
    • supports : 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인하는 메서드
    • validate : 유효성 검사를 하는 메서드

     DataBean1Validator.java  

    public class DataBean1Validator implements Validator{
    	
    	@Override
    	public boolean supports(Class<?> clazz) {
    		// TODO Auto-generated method stub
    		return DataBean1.class.isAssignableFrom(clazz);
    	}
    	@Override
    	public void validate(Object target, Errors errors) {
    		// TODO Auto-generated method stub
    		ValidationUtils.rejectIfEmpty(errors, "data2", "error2");
    		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");
    		
    		DataBean1 bean1 = (DataBean1)target;
    		
    		String data2 = bean1.getData2();
    		String data3 = bean1.getData3();
    		if(data2.length() > 10)
    			errors.rejectValue("data2", "error4");
    		if(data3.contains("@") == false)
    			errors.rejectValue("data3", "error5");
    
    	}
    	
    }
    public boolean supports(Class<?> clazz) {
     - clazz안에 유효성 검사를 하기 위한 클래스 타입이 들어온다.

    DataBean1.class.isAssignableFrom(clazz);
     - 해당 클래스가 유효성 검사가 가능한지 알아본다.

     public void validate(Object target, Errors errors) {
     - 유효성 검사를 실행하는 곳
     - Controller에 등록해줘야 한다.
     - Controller에 등록 시 해당 유효성 검사를 시행
     - 객체의 주소 값은 target에 들어온다.
     - 기본적으로 제공되는 메서드들이 있다.

    ValidationUtils.rejectIfEmpty(errors, "data2", "error2");
     - 기본적으로 제공되는 메서드, 값이 비어 있는지 확인
     - rejectIfEmpty(error객체, 프로퍼티이름, 코드이름)
     - 위반 내용이 있으면 error 객체에 오류정보를 저장
     - error2.dataBean1.data2 로 오류코드가 저장된다.

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");
     - 기본적으로 제공되는 메서드, 값이 비어있거나 공백으로 되어있는지 확인
     - rejectIfEmpty(error객체, 프로퍼티이름, 코드이름)
     - 위반 내용이 있으면 error 객체에 오류정보를 저장
     - error3.dataBean1.data3 로 오류코드가 저장된다.

    errors.rejectValue("data2", "error4");
    errors.rejectValue("data3", "error5");
     - 기본 메서드를 이용하지 않고 유효성 조건을 직접 만들어 검사할 때 사용
     - 위반 내용이 있으면 rekectValue를 통해 오류정보를 저장
     - rejectValue(프로퍼티이름, 코드이름)
     - error4.dataBean1.data2 로 오류코드가 저장된다.

     


     

     

    Controller에 개발자가 설정한 Validate 등록

    Controller

    @Controller
    public class testControllor {
    
    	@GetMapping("/input_data")
    	public String input_data(DataBean1 dataBean1) {
    		
    		return ("input_data");
    	}
    	@PostMapping("/input_pro")
    	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
    		
    		if(result.hasErrors())
    			return "input_data";
    		
    		return "input_success";
    	}
    	
    	@InitBinder
    	public void initBinder(WebDataBinder binder) {
        
    		DataBean1Validator validator1 = new DataBean1Validator();
    		binder.setValidator(validator1);
            
    	}
    }
    @InitBinder
     - Validator 등록

    public void initBinder(WebDataBinder binder) {
     - WebDataBinder : HTTP 요청정보를 컨트롤러 메서드의 파라미터나 모델에 바인딩할 때
      사용되는 바인딩 오브젝트

    DataBean1Validator validator1 = new DataBean1Validator();
     - 설정한 사용자 정의 Validator 객체 생성

    binder.setValidator(validator1);
     - 사용자 정의 Validator가 1개일 때 

    binder.addValidators(validator1);
     -  사용자 정의 Validator가 1개 이상일 때 

     

     

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.