유효성 검사(validation)란 입력 내용이 요건에 만족하는지 그 타당성을 확인하는 입력 체크를 말함.
입력 항목 하나에 대해 설정하는 입력 체크 기능. Form 클래스 등의 필드에 어노테이션을 부여해서 사용함.
어노테이션은 Java EE에서 제공하는 어노테이션(Bean Validator)이나 하이버네이트(Hibernate) 프레임워크에서 제공하는 어노테이션(Hibernate Validator) 이 있음
어노테이션 | 기능 설명 | 사용 예 |
---|---|---|
@NotNull | null 값이 아닌 것을 검증 | @NotNull Integer no; |
@NotEmpty | 문자열이 null 혹은 공백문자("")가 아닌 것을 검증 | @NotEmpty String name; |
@NotBlank | 문자열이 null 혹은 공백(스페이스나 탭)이 아닌 것을 검증 | @NotBlank String name; |
@Max | 지정한 숫자 이하인 것을 검증 | @Max(100) Integer price; |
@Min | 지정한 숫자 이상인 것을 검증 | @Min(10) Integer age; |
@Size | 문자열이나 컬렉션이 지정한 범위의 크기 내인 것을 검증 | @Size(min=0, max=10) List<> selected; |
@AssertTrue | 값이 true인 것을 검증 | @AssertTrue Boolean empty; |
@AssertFalse | 값이 false인 것을 검증 | @AssertFalse Boolean empty; |
@Pattern | 지정한 정규 표현과 일치하는 것을 검증 | @Pattern(regexp="[a-zA-Z0-9]" |
@Range | 지정한 숫자 범위 안에 있는 것을 검증 | @Range(min=1, max=10) Integer point; |
@Decimalmax | 지정한 숫자 이하인 것을 검증 | @DecimalMax("100.0") BigDecimal val; |
@DecimalMin | 지정한 숫자 이상인 것을 검증 | @DecimalMax("10.0") BigDecimal val; |
@Digits | 정수부와 소수부의 자릿수를 검증 | @Digits(integer=3, fraction=1) BigDecimal val; |
@Future | 미래의 날짜인 것을 검증 | @Future Date date; |
@Past | 과거의 날짜인 것을 검증 | @Past Date date |
@Valid | 중첩된 Form을 검증 | @Valid SampleForm sampleForm; |
@Length | 문자열 길이가 지정한 범위 안에 있는 것을 검증 | @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";
}
}
<body>
<form 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>
//확인 화면을 표시 : form 클래스 이용
@PostMapping("calc")
public String conFirmView(@Validated CalcForm form,
BindingResult bindingResult, Model model){
//입력 체크에서 에러가 발생한 경우
if(bindingResult.hasErrors()){
//입력 화면으로
return "entry";
}
//값 더하기
Integer result = form.getLeftNum() + form.getRightNum();
//Model에 저장
model.addAttribute("result", result);
//확인 화면으로
return "confirm";
<!--에러 표시-->
<ul th:if="${#fields.hasErrors('*)}">
<li th:each="err:${#fields.errors('*')" th:text="${err}"></li>
</ul>
애플리케이션에서 표시하는 메세지는 프로그램과 별도로 관리함. 메시지를 템플릿에서 분리해서 메시지만 프로퍼티파 파일로 관리하는 편히 유지관리가 편하기 때문
#entry 화면용
title.entry = 입력화면
button.send = 계산
#CalcForm용
calcForm.leftNum=왼쪽
calcForm.rightNum=오른쪽
<title th:text="#{title.entry}">제목</title>
<button type="submit" th:text="#{button.send}"></button>
# 단일 항목 검사용 메세지
javax.validation.constraints.NotNull.message={0} : 숫자를 입력해주세요
org.hibernate.validator.constraints.Range.message ={0} : {min}~{max} 범위의 숫자를 입력해주세요.
# 형변환 체크용 메세지
typeMismatch.java.lang.Integer={0}은 정수를 입력해주세요.
@NotNull
@Range(min=1, max=10)
private Integer leftNum;
@NotNull
@Range(min=1, max=10)
private Integer rightNum;