반응형
BindingResult 사용(1)
BindingResult 를 사용해서 조금 더 간단하게 검증 에러를 체크할 수 있다.
public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model)
컨트롤러에서 선언해서 사용하는데 중요한 점은 @ModelAttribute 뒤에 BindingResult가 와야 한다는 점이다. 왜냐하면 BindingResult는 Model 객체, 위에서는 Item에 대한 값을 가지고 있기 때문에 순서가 매우 중요하다.
Map<String, String> errors = new HashMap<>();
//검증 로직
if (!StringUtils.hasText(item.getItemName())) { //넘어온 글자가 없으면
errors.put("itemName", "상품 이름은 필수입니다."); //상품 이름은 필수입니다.를 넘겨준다.
}
원래는 이렇게 errors를 직접 만들어서 사용했는데 바인딩을 사용하면
if (!StringUtils.hasText(item.getItemName())) { //넘어온 글자가 없으면
bindingResult.addError(new FieldError("item", "itemName", "상품 이름은 필수입니다."));
}
따로 errors를 만들 필요도 없이 BindingResult에서 제공하는 Error를 사용해서 간단하게 할 수 있다.
인텔리제이 기준으로 Ctrl+P를 누르면 파라미터 값으로 무엇을 넣어야 하는지 체크할 수 있다.
//특정 필드가 아닌 복합 룰 검증
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item.getPrice() * item.getQuantity();
if(resultPrice < 10000) {
bindingResult.addError(new ObjectError("item", "가격 * 수량의 합은 10000원 이상이어야 합니다. 현재 값 = " + resultPrice));
}
}
복합 룰 검증에서 BindingResult는 자동으로 model을 포함하기 떄문에 자동으로 값을 넘긴다. 때문에 model을 안 써도 된다. 여기서는 Item 값을 가지고 있다.
<div>
<label for="itemName" th:text="#{label.item.itemName}">상품명</label>
<input type="text" id="itemName" th:field="*{itemName}"
th:errorclass="field-error"
class="form-control" placeholder="이름을 입력하세요">
<div class="field-error" th:errors="*{itemName}">
상품명 오류
</div>
</div>
상품명 부분역시 이렇게 간단하게 작성할 수 있다. 이전 코드는 아래와 같다.
<div>
<label for="itemName" th:text="#{label.item.itemName}">상품명</label>
<input type="text" id="itemName" th:field="*{itemName}"
th:class="${errors?.containsKey('itemName')} ? 'form-control field-error' : 'form-control'"
class="form-control" placeholder="이름을 입력하세요">
<div class="field-error" th:if="${errors?.containsKey('itemName')}" th:text="${errors['itemName']}">
상품명 오류
</div>
</div>
BindingResult를 사용하지 않은 이전 코드이다.
다시 보니 복잡하게 되어 있다.
📝 ← 검증과 오류 메시지 공식 메뉴얼을 참고하면 된다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.
반응형
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : FieldError과 ObjectError에 대해서 (0) | 2022.02.10 |
---|---|
[Spring Boot] : BindingResult 사용(2) (0) | 2022.02.10 |
[Spring Boot] : 타임리프를 통한 검증 코드 추가하기 (0) | 2022.02.10 |
[Spring Boot] : 타임리프 Message 국제화 (0) | 2022.02.09 |
[Spring Boot] : 타임리프 웹 애플리케이션 Message에 적용하기 (0) | 2022.02.09 |
댓글