본문으로 바로가기

유효성 검사 (Validate)

category Java/java 2020. 10. 27. 00:47

유효성 검사

 : JavaScript로 처리

   - 클라우드 브라우저에서 서버로 요청이 발생하기 전에 먼저 확인을 할 경우

 

 : SpringMVC 처리

   - 클라이언트가 전달한 데이터를 서버에서 먼저 확인을 하고 저장할지 말지를 결정할 수 있다.

 

 

JSR-303

 : SpringMVC는 JSR-303 규격의 유효성 검사 라이브러리를 사용할 수 있습니다.

 : Bean에 데이터가 입력될 때 어떤 검사를 할 것인지 어노테이션으로 지정하고

   지정된 어노테이션의 조건에 맞지 않으면 개발자에게 입력값에 오류가 있다는

   정보를 전달합니다.

 : 개발자는 이를 통해 유효성 검사를 진행할 수 있습니다.

 

 : pom.xml에 javax.validation & hibernate.validator 라이브러리 추가

 

Bean에 어노테이션 설정

 : 먼저 Bean에 어노테이션을 설정합니다. JSR-303과 Hibernate에서는

   다양한 어노테이션을 제공하고 있습니다.

@Size(min=2, max=10)
private String data1;	// 이 변수에 들어가는 글자는 최소 2글자에서 최대 10글자까지 허용한다.
			// 조건을 벗어나면 잘못되었다는 정보가 옴
@Max(100)
private int date2;	// 이 정수에는 최대 100까지 들어갈 수 있다.

 

@Valid

 : @Valid 어노테이션을 안붙이면 조건을 설정해도 유효성 검사를 하지 않는다.

 : Controller의 메서드에서 주입받는 Bean에 @Valid를 설정하면 유효성 검사를 실시합니다.

 : 유효성 검사 결과를 사용하고자 한다면 BindingResult 객체를 주입받아야 합니다.

   - 이 객체에는 유효성 검사를 실행한 결과 정보가 담겨잇습니다.

 : 이를 통해 Controller에서 사용자가 입력한 값에 문제가 있는지 파악할 수 있습니다.

@RequestMapping("")
	public String input_pro(@Valid TestBean testBean, BindingResult result) {
		
		if(result.hasErrors()) {
			for(ObjectError obj : result.getAllErrors()) {
				System.out.printf("메세지 : %s\n", obj.getDefaultMessage());
				System.out.printf("Code : %s\n", obj.getCode());
				System.out.printf("Object Name : %s\n", obj.getObjectName());
				
				String[] codes = obj.getCodes();
				
				for(String c1 : codes) {
					System.out.println(c1);
				}
			}
			
		}
		
		return "";
	}

 

 

에러 메시지 커스터 마이징

 : 에러 메시지

   - 유효성 검사에서 오류가 있다고 판단되는 항목에 대해서 Jsp에서 메시지를 출력하였습니다.

   - 우리가 출력한 메시지는 JSR-303에서 정의한 메시지가 그대로 나오는 것이며,

     우리가 설정한 문자열은 아닙니다.

   - JSR-303과 Hibernate에서 제공하는 어노테이션 중 일부는 새로운 메시지를 셋팅할 수 있고

     일부는 셋팅하지 못합니다

 

 : Properties를 이용한 메시지 설정

   - 유효성 검사를 통과하지 못하면 Jsp에 오류 관련된 정보가 전달됩니다.

   - 이 때, codes[0]으로 값을 가져오면 다음 양식으로 문자열을 가져올 수 있습니다.

     에러종류.빈 이름.프로퍼티 이름    ex) Size.testBean.data1

   - 우리가 properties 파일에 위와 같은 양식의 이름으로 메시지를 등록해주면

      properties 파일에 작성한 문자열을 가져와 출력할 수 있고, 다국어 처리까지 가능해집니다.

 

 

Form 데이터 유지하기

 : 유효성 검증에 통과하지 못해 다시 입력화면으로 돌아왔을 때 기존에 입력했던 내용을 유지해야할 경우

   화면으로 전달된 Bean객체에서 input 태그에 값을 주입하면 됩니다.

 : SpringMVC의 Form 커스텀 태그를 활용하면 됩니다.

 : 이 때. 검증 실패 문자열도 손쉽게 셋팅하는 것이 가능합니다.

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="" modelAttribute="Bean" method="post">
	Data1 : <form:input path="data1" type="text"/>
    		<form:errors path="data1"/><br>
	Data2 : <form:input path="data2" type="text"/>
    		<form:errors path="data2"/><br>
	<form:button type="submit">확인</form:button>
</form:form>

 

 

JSR-303

종류 설명
@AssertTrue True가 아닌 값이 들어오면 오류
@AssertFalse False가 아닌 값이 들어오면 오류
@Max(값) 값보다 큰 값이 들어오면 오류
@Min(값) 값보다 작은 값이 들어오면 오류
@DecimalMin(value=값, inclusive=true/false) 값보다 크거나 같은 값이 들어와야 합니다.
inclusive가 false면 같은 값은 포함하지 않기 때문에
큰 값이 들어와야 합니다.
@Null 값이 들어오면 오류가 발생
@NotNull 값이 들어오지 않으면 오류가 발생
@Digits(integer=자릿수, fraction=자릿수) 지정된 자릿수의 숫자가 아닐 경우 오류가 발생
Integer -> 정수 자릿수, Fraction -> 실수 자릿수
@Size(min=글자 수, max=글자 수) 지정된 글자 수보다 짧거나 길면 오류가 발생
@Pattern(regexp=정규식) 주어진 정규식에 위배되면 오류 발생

 

JSR-380

종류 설명
@NotEmpty 주입된 값의 길이가 0이면 오류 발생
공백도 글자로 인식합니다.
@NotBlank 주입된 값의 공백을 제거하고 길이가 0이면 오류 발생
@Positive 양수가 아니라면 오류 발생
@PositiveOrZero 0또는 양수가 아니라면 오류 발생
@Negative 음수가 아니라면 오류 발생
@NegativeOrZero 0또는 음수가 아니라면 오류 발생
@Email 이메일 형식이 아니라면 오류 발생
중간에 @가 있는지 정도만 확인한다.

 

Vaildator 커스텀 마이징

 : Validator 인터페이스 구현

   - 먼저 Validator 인터페이스를 구현해야 합니다

   - supports = 유효성 검사할 데이터를 가지고 있는 개체가 유효성 검사가 가능한지 확인합니다.

   - validate = 유효성을 하는 메서드

public class testValidator implements Validator{

	@Override		// clazz에는 유효성 검사를 하기 위한 빈 클래스 타입이 들어옴
    public boolean supports(Class<?> clazz){	// 클래스가 유효성 검사가 가능한지 확인
    	return testValidator.class.isAssignableForm(clazz);
    }
	
    @Override
    public void validate(Object target, Errors errors){
    	ValidationUtils.rejectIfEmpty(errors."data2", "error2");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors."data3", "error3");
        
        DataBean1 bean1 = (DataBean1) target;
        
        String data2 = bean1.getData2();
        String data3 = bean1.getData3();
        
        if(data2.lenght() > 10){
        	errors.rejectValue("data2", "error4");
        }
        
        if(data3.contains("@") == false){
        	errors.rejectValue("data3", "error5");
        }
    }
    
}
error_message.properties

error2.dataBean1.data2 = data2의 길이는 0보다 커야함
error3.dataBean1.data3 = data3은 공백을 제거해도 0보다 커야함
error4.dataBean1.data2 = data2의 길이는 10미만
error5.dataBean1.data3 = data3은 @를 포함해야 함

 

 : Validator를 컨트롤러에서 등록

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

   - 보통 객체 하나에 대한 Validator 하나해서 Validator를 여러 개 만드는게 일반적

@InitBinder
protected void initBinder(WebDataBinder binder){
	testValidator validator = new testValidator();
	binder.setValidator(validator);
}

 

 

ValidateUtils

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

 

 : rejectIfEmpty(error 객체, "프로퍼티 이름", "코드 이름")

    - 값이 비어있는지 확인합니다. 공백은 글자로 취급합니다.

 

 : rejectIfEmptyOrWhitespace(error 객체, "프로퍼티 이름", "코드 이름")

    - 값이 비어있거나 공백으로만 구성되어 있는지 확인합니다.

 

 : 입력값에 문제가 있다면 error객체에 오류 정보를 저장합니다.

 : 사용할 오류 메시지는 "코드이름.bean 객체이름.프로퍼티 이름"으로 구성됩니다.

 

rejectValue

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

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

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

 : 입력 값에 문제가 있다면 error 객체에 오류 정보를 저장합니다.

 : 사용할 오류 메시지는 "코드이름.bean 객체이름.프로퍼티 이름"으로 구성됩니다.

반응형

'Java > java' 카테고리의 다른 글

[JMeter] 제이미터 설치 및 사용  (0) 2023.05.24
IoC 컨테이너  (0) 2020.10.26
AOP (Aspect Oriented Programming)  (0) 2020.10.26
빈 xml 객체 생성 정리  (0) 2020.10.21
스프링(Spring)의 특징과 의존성 주입(DI)  (0) 2020.10.20