유효성 검사
: 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또는 음수가 아니라면 오류 발생 |
이메일 형식이 아니라면 오류 발생 중간에 @가 있는지 정도만 확인한다. |
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 객체이름.프로퍼티 이름"으로 구성됩니다.