풀스택 개발자 2020. 5. 12. 18:43

JSR-303, JSR-380 스펙을 이용한 유효성 검사 방법을 학습함.

 

지금까지는 유효성 검사를 하기위해 Hibernate를 사용하였습니다.

 

이번에는 Validator 를 직접 만들어 보도록 하겠습니다.

 

JSR-303 , JSR-380 스펙으로 유효성 검사를 한 후 추가적으로 다른 유효성 검사를 하고자 할 때 사용합니다.

 

 

 

validator 인터페이스 구현

 

먼저 validator인터페이스를 구현합니다

 

supports : 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인합니다.(구현되있음)

 

validate : 유효성 검사를 하는 메서드

 

package kr.co.softcampus.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;

import kr.co.softcampus.beans.DataBean1;

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) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
		// TODO Auto-generated method stub
		
		
	}
	

}

 

 

validator를 컨트롤러에서 등록

 

validator를 컨트롤러에서 등록해줍니다

 

사용할 validator가 하나면 setValidator, 한 개 이상이면 addValidators메서드를 사용합니다

 

@PostMapping("/input_pro")
	public String input_pro(@Valid DataBean1 dataBean1,BindingResult result) {
		
		if(result.hasErrors()) {
			return "input_data";
		}
		
			return "input_success";
	}
	@InitBinder
	protected void initBinder(WebDataBinder binder)
	{
		DataBean1Validator validator1 = new DataBean1Validator();//@Valid가 붙어있는 객체의 변수의 값들을 이곳으로 넘겨서 검사함
		binder.setValidator(validator1);//@Valid가 붙어있는 bean이 여러개일때 validator갯수가 늘어남..validator1,validator2..
	}

 

validdateUtils

 

지정된 값에 대해 유효성 검사를 하는 메서드

 

rejectIfEmpty(error객체,"프로퍼티이름","코드이름"):값이 비어 있는지 확인합니다. 공백은 글자로 취급합니다.

 

rejectIfEmptyOrWhitespace(error객체,"프로퍼티이름","코드이름") : 값이 비어 있거나 공백으로만 구성되어 있는지 확인합니다.

 

입력값에 문제가 있다면 error 객체에 오류정보를 저장합니다. 사용할 오류 메시지는 "코드이름.bean객체이름.프로퍼티이름"으로 구성됩니다.

 

package kr.co.softcampus.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;

import kr.co.softcampus.beans.DataBean1;

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) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
		// TODO Auto-generated method stub
		
		ValidationUtils.rejectIfEmpty(errors, "data2","error2");//dataBean1의 data2의 변수의 값의 길이가 0이면 유효성검사 실패 0이 아니면 유효성검사 통과
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");//data3의 길이가 0이거나 공백으로만 채워져있으면 에러3이라는 에러발생
		
	

}

 

rejectValue

 

유효성 조건을 직접 만들어 검사할 때 사용합니다

 

if문으로 유효성 검사를 해주고 위배시 rejectValue를 통해 오류 정보를 지정합니다

 

rejectValue("프로퍼티이름","코드이름")

 

입력값에 문제가 있다면 error 객체에 오류 정보를 저장합니다. 사용할 오류 메시지는 "코드이름.bean객체이름.프로퍼티이름"으로 구성됩니다

 

package kr.co.softcampus.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.support.WebBindingInitializer;

import kr.co.softcampus.beans.DataBean1;

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) {//유효성 검사를 하는곳 @valid가 붙어져있는 dataBean1의 주솟값이 target매개변수로 들어옴
		// TODO Auto-generated method stub
		
		ValidationUtils.rejectIfEmpty(errors, "data2","error2");//dataBean1의 data2의 변수의 값의 길이가 0이면 유효성검사 실패 0이 아니면 유효성검사 통과
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");//data3의 길이가 0이거나 공백으로만 채워져있으면 에러3이라는 에러발생
		
		DataBean1 bean1 = (DataBean1)target;
		
		String data2=bean1.getData2();
		String data3=bean1.getData3();
		
		if(data2.length()>10) {
			errors.rejectValue("data2", "error4");//dataBean1의 data2의 길이가 10보다 크면 error4.dataBean1.data2에러발생
		}
		
		if(data3.contains("@") == false)
		{
			errors.rejectValue("data3", "error5");//dataBean1의 data2에 @ 가없으면 error5.dataBean1.data3에러발생
		}
	}
	

}