Spring/Spring MVC
[Spring MVC] 검증 - Spring 순수 Validation
잉숭
2021. 7. 18. 13:59
Validation V1
입력값 에러를 처리하기 위해 컨트롤러에 검증로직을 추가하였다
만약 에러가 발생하면 이를 HashMap에 저장하고 Model에 담아 뷰로 전달한다
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item.getPrice() * item.getQuantity();
if (resultPrice < 10000) {
errors.put("globalError", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice);
}
}
<form action="item.html" th:action th:object="${item}" method="post">
<div th:if="${errors?.containsKey('globalError')}">
<p class="field-error" th:text="${errors['globalError']}">전체 오류 메시지</p>
</div>
Validation V2
Spring은 에러를 저장하는 BindingResult객체를 제공한다
이 객체는 FieldError, ObjectError 객체를 저장하여 Model에 담긴다
(FieldError, ObjectError는 각각 필드 에러, 글로벌 에러를 저장한다)
이 객체를 사용하면 다음과 같이 수정된다
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item.getPrice() * item.getQuantity();
if (resultPrice < 10000) {
bindingResult.addError(new ObjectError("item", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice));
}
}
<form action="item.html" th:action th:object="${item}" method="post">
<div th:if="${#fields.hasGlobalErrors()}">
<p class="field-error" th:each="err : ${#fields.globalErrors()}" th:text="${err}">글로벌 오류 메시지</p>
</div>
Validation V3
FieldError, ObjectError는 각각 RejectValue(), Reject() 함수를 사용함으로 대체할 수 있다
각각의 정의는 다음과 같다
void rejectValue(@Nullable String field, String errorCode,
@Nullable Object[] errorArgs, @Nullable String defaultMessage);
void reject(String errorCode, @Nullable Object[] errorArgs,
@Nullable String defaultMessage);
객체 바로 뒤에 BindingResult가 존재하므로 어떤 객체를 검증하는 것인지 입력할 필요 없이 사용해도 된다
Validation V4
컨트롤러의 검증 부분을 따로 빼서 새로운 클래스로 등록하자
그리고 InitBinder에 해당 검증기를 등록하고 이를 사용하자
@InitBinder
public void init(WebDataBinder dataBinder) {
dataBinder.addValidators(itemValidator);
}
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (bindingResult.hasErrors()) {
return "validation/v2/addForm";
}
}
@ModelAttribute 앞에 @Validated 붙여 InitBinder에 등록된 검증기를 먼저 실행한다