검증(Validation)이란 입력된 데이터나 값을 정해진 규칙이나 요구 사항에 따라 확인하고, 올바른지 아닌지를 판별하는 과정이다. 서버는 클라이언트의 요청을 검증함으로써 잘못된 데이터 입력을 방지한다.
스프링은 BindingResult 인터페이스를 통해 검증 실패 정보를 보관한다. 컨트롤러의 메서드 선언부에 BindingResult를 매개변수로 지정하고 직접 검증을 실행할 수 있다. BindingResult 구현체로 사용하는 BeanPropertyBindingResult는 검증 실패 정보를 담는 객체인 ObjectError와 이를 상속한 FieldError를 List 형식으로 관리하고 있다.
검증 실패 정보를 저장하려면 addError()를 호출한다.
@PostMapping("/items/add")
public String addItem(@ModelAttribute Item item,
BindingResult bindingResult) {
if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1_000_000) {
bindingResult.addError(new FieldError("item", "price", item.getPrice(), false,
new String[] {"range.item.price"}, new Object[]{1000, 1_000_000}, null));
}
if (bindingResult.hasErrors()) {
return "validation/v2/addForm";
}
...
부가적으로 BindingResult를 자동으로 Model에 추가하기 때문에 별도로 추가하지 않아도 템플릿 엔진에서 바로 사용할 수 있다.
<form action="/register" method="post" th:object="${user}">
<input type="text" name="name" placeholder="Name" th:field="*{name}">
<div th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</div>