본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : BindingResult 사용(1)

by 오주현 2022. 2. 10.
반응형

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편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글