쌓고 쌓다

BindingResult rejectValue(), reject() 본문

프로그래밍/spring

BindingResult rejectValue(), reject()

승민아 2023. 8. 30. 16:21

앞서 작성한 bindingResult를 보자.

bindingResult.addError(new ObjectError("poster", null, null, "조건: 키와 몸무게 합은 150이상."));

 

ObjectError 객체를 생성하는데 번거로움이 있다.

이것을 더 간략히 해보자.

 

BindingResult 파라미터의 위치는 @ModelAttribute 뒤에 위치한다.

그러므로 앞서 작성한 ObjectError 객체 생성에 objectName인 "poster"를 작성할 필요가 있을까?

 

그렇다. BindingResult는 검증할 객체를 알고 있다.

log.info("objectName={}", bindingResult.getObjectName());
log.info("target={}", bindingResult.getTarget());

로그를 찍어서 확인할 수 있다.

 

rejectValue(), reject()

rejectValue, reject 메서드를 사용하여 FieldError, ObjectError를 직접 생성하지 않고도 검증이 가능하다.

 

사용 코드를 보자.

@PostMapping("/add")
public String addItemV4(@ModelAttribute Item item, BindingResult bindingResult) {

    if(!StringUtils.hasText(item.getItemName())) {
        bindingResult.rejectValue("itemName", "required");
    }
    
    if(resultPrice<10000) {
        bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);
    }
    
}

에러 메시지 코드를 관리하는 errors.properties에 존재하는 키 값(에러 코드)을 입력하지 않았는데 동작이 된다.

  • rejectValue: 필드 에러 ( 에러 필드("itemName"), 에러 코드("itemName")를 작성함 )
  • reject: 글로벌 에러 ( 에러 코드("totalPriceMin")만 작성하고, 필드를 지정하지 않음 )

 

errros.properties

required.item.itemName=상품 이름은 필수입니다.
range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
max.item.quantity=수량은 최대 {0} 까지 허용합니다.
totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}

errors.properties의 작성 규칙을 보면 답이 있다.

"에러 코드.에러 객체.에러 필드" 순서이다.

 

글로벌 에러는 에러 코드만 작성한다.

Comments