[Spring] 스프링이 제공하는 검증 오류 처리 방법, BindingResult

썸머·2022년 11월 14일
0

스프링이 제공하는 검증 오류 처리 방법

BindingResult

@PostMapping("/add")
public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes) {
 if (!StringUtils.hasText(item.getItemName())) {
 bindingResult.addError(new FieldError("item", "itemName", "상품 이름은
필수입니다."));
 }
 if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() >
1000000) {
 bindingResult.addError(new FieldError("item", "price", "가격은 1,000 ~ 
1,000,000 까지 허용합니다."));
 }
...(생략)...
  • BindingResult bindingRsult 파라미터의 위치는 @ModelAttribute Item item 다음에 와야한다.
  • BindingResult는 Model에 자동으로 포함된다.

    [FieldError - 필드 오류]

1. public FieldError(String objectName, String field, String defaultMessage) {}
  • objectName: @ModelAttribute 이름
  • field: 오류가 발생한 필드 이름
  • defaultMessage: 오류 기본 메시지
2. public FieldError(String objectName, String field, @Nullable Object 
rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable
Object[] arguments, @Nullable String defaultMessage)
  • rejectedValue : 사용자가 입력한 값(거절된 값)
    -> 오류 발생시 사용자 입력 값을 저장하는 필드
  • bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값
  • codes : 메시지 코드
  • arguments : 메시지에서 사용하는 인자

    [ObjectError - 글로벌 오류]

public ObjectError(String objectName, String defaultMessage) {}
  • objectName: @ModelAttribute의 이름

  • defaultMessage: 오류 기본 메시지

    [타임리프 스프링 검증 오류 통합 기능]

<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>
 <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>
  • #fields : #fields 로 BindingResult 가 제공하는 검증 오류에 접근할 수 있다.

  • th:errors : 해당 필드에 오류가 있는 경우에 태그를 출력한다. th:if 의 편의 버전이다.

  • th:errorclass : th:field 에서 지정한 필드에 오류가 있으면 class 정보를 추가한다.

    [데이터 바인딩 오류]

  • BindingResult가 없으면 -> 400오류
    BindingResult가 있으면 -> 오류정보(FieldError)를 BindingResult에 담아서 컨트롤러를 정상 호출한다.

  • 타입 오류로 바인딩에 실패하면 스프링은 FieldError를 생성하면서 사용자가 입력한 값을 넣어둔다. 그리고 해당 오류를 BindingResult에 담아서 컨트롤러 호출한다.

  • BindingResult에 검증 오류를 적용하는 3가지 방법

    1. @ModelAttribute의 객체에 타입 오류 등으로 바인딩이 실패하는 경우 스프링 FieldError를 생성해서 BindingResult에 넣어준다.
    2. 개발자가 직접 넣어준다.
    3. Validator 사용한다.
profile
썸머의 개발블로그

0개의 댓글