입력 내용이 요건에 만족하는지 그 타당성을 확인하는 입력 체크를 말한다.
입력 항목 하나에 대해 설정하는 입력 체크 기능. 클래스의 필드에 어노테이션을 부여해서 사용할 수 있다.
어노테이션 | 기능 설명 | 사용 예 |
---|---|---|
@NotNull | null 값이 아닌 것을 검증 | @NotNull Integer number; |
@NotEmpty | 문자열이 null 혹은 공백문자("") 가 아닌지 검증 | @NotEmpty String name; |
@NotBlank | 문자열이 null 혹은 공백( 스페이스나 탭 등 ) 이 아닌지 검증 | @NotBlank String name; |
@Max | 지정한 숫자 이하인 것을 검증 | #100 이하인지 @Max(100) Integer price; |
@Min | 지정한 숫자 이상인 것을 검증 | #10 이상인지 @Min(10) Integer age; |
@Size | 문자열이나 컬렉션이 지정한 범위의 크기 내인 것을 검증 | #요소의 수가 0에서 10의 범위인것을 검증 (문자열은 길이, 컬렉션은 사이즈 ) @Size(min=0, max=10) List selected; |
@AssetTrue | 값이 true 인 것을 검증 | @AssertTrue Boolean empty; |
@AssertFalse | 값이 false 인 것을 검증 | @AssertFalse Boolean empty; |
@Pattern | 지정한 정규 표현과 일치하는 것을 검증 | #영숫자 검증 @Pattern(regexp="[a-zA-Z0-9]*") |
@Range | 지정한 숫자 범위 안에 있는 것을 검증 | #1 이상, 10 이하 인것을 검증 @Range(min=1, max=10) Integer point; |
@DecimalMax | 지정한 숫자 이하인 것을 검증 (소수점 이하 포함해서 검증 필요) | #100.0 이하 검증 @DemicalMax("100.0") BigDecimal value; |
@DecimalMin | 지정한 숫자 이상인 것을 검증 (소수점 이하 포함해서 검증 필요) | #10.0 이상 검증 @DecimalMin("10.0") BigDecimal value; |
@Digits | 정수부와 소수부의 자릿수를 검증 | #정수부가 3, 소수부가 1인것을 검증 @Digits(integer=3, fraction=1) BigDecimal value; |
@Future | 미래의 날짜인 것을 검증 | @Future Date date; |
@Past | 과거의 날짜인 것을 검증 | @Past Date date; |
@Valid | 중첩된 Form을 검증 | @Valid SampleForm sampleForm; |
@Length | 문자열 길이가 지정한 범위 안에 있는 것을 검증 ( 문자열 전용 Size ) | @Length(min=0, max=10) String name; |
문자열이 이메일 주소 형식인지 검증 | @Email String email; | |
@CreditCardNumber | 문자열이 신용카드 번호 형식인지 검증 | @CreditCardNumber String card; |
@URL | 문자열이 URL 형식인지 검증 | @URL String url; |
@Data
public class CalcForm {
@NotNull(message = "왼쪽 : 숫자를 입력해주세요.")
@Range(min=1, max=10, message = "왼쪽 : {min}~{max} 범위의 숫자를 입력해주세요.")
private Integer leftNum;
@NotNull(message = "오른쪽 : 숫자를 입력해주세요.")
@Range(min=1, max=10, message = "오른쪽 : {min}~{max} 범위의 숫자를 입력해주세요.")
private Integer rightNum;
}
@Controller
public class ValidationController {
/** form-backing bean 초기화 */
@ModelAttribute
public CalcForm setUpForm() {
return new CalcForm();
}
/** 입력 화면 표시 */
@GetMapping("show")
public String showView() {
// 반환값으로 뷰 이름을 돌려줌
return "entry";
}
}
유효성 검사를 위해 form-backing bean 초기화 진행
@ModelAttribute 어노테이션을 사용하여 연결한다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>입력 화면</title>
</head>
<body>
<form th:action="@{/calc}" method="post" th:object="${calcForm}">
<div>
<input type="text" th:field="*{leftNum}">
+
<input type="text" th:field="*{rightNum}">
</div>
<input type="submit" value="계산">
</form>
</body>
</html>
/** 확인 화면을 표시 : Form 클래스 이용 */
@PostMapping("calc")
public String confirmView(@Validated CalcForm form, BindingResult bindingResult, Model model) {
// 입력 체크에서 에러가 발생한 경우
if (bindingResult.hasError()) {
// 입력 화면으로
return "entry";
}
// 값 더하기
Integer result = form.getLeftNum() + form.getRightNum();
// Model에 저장
model.addAttribute("result", result);
// 확인 화면으로
return "confirm";
}
entry.html에 추가
<!-- 에러표시 -->
<ul th:if="${#fields.hasErrors('*')}">
<li th:each="err:${#fields.errors('*')}" th:text="${err}"></li>
</ul>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>확인 화면</title>
</head>
<body>
<h2> 계산 결과 </h2>
<h3>[[${calcForm.leftNum}]]+[[${calcForm.rightNum}]]=[[${result}]]</h3>
</body>
</html>
@Component
public class CalcValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
// 인수로 전달받은 Form이 입력 체크의 대상인지 논리값으로 돌려준다.
return CalcForm.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors error) {
// 대상 Form을 취득
CalcForm form = (CalcForm) target;
// 값이 입력되어 있는지
if (form.getLeftNum() != null && form.getRightNum() != null) {
// 왼쪽 입력 값이 홀수이고 오른쪽 입력 값이 짝수가 아닌 경우
if (!((form.getLeftNum() % 2 == 1) && (form.getRightNum() % 2== 0))) {
// 에러인 경우에는 Errors 인터페이스의 reject 메서드에
// 에러 메시지의 키를 지정한다.
error.reject("com.example.demo.validator.CalcValidator.message");
}
}
}
}
# 커스텀 유효성 검사용
com.example.demo.validator.CalcValidator.message=왼쪽에는 홀수를, 오른쪽에는 짝수를 입력해주세요.
@Autowired
CalcValidator calcValidator;
/** 커스텀 유효성 검사기 등록 */
@InitBinder("calcForm")
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.addValidators(calcValidator);
}
@InitBinder 어노테이션에는 체크대상 Form 클래스의 Model 에 식별명을 지정한다.