본문 바로가기
Spring/MVC

BindingResult

by o3oppp 2024. 6. 27.
BindingResult
  • Spring이 제공하는 검증 오류 처리 방법의 핵심
  • Spring이 제공하는 검증 오류를 보관하는 객체
  • 검증 오류 발생 시 해당 객체에 보관
    • @RequestParam, @ModelAttribute에서 바인딩 에러가 발생하는 경우 해당 객체에 에러 내용이 담김
  • @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출 됨
    • BindingResult가 없는 경우 : 400 error 발생, 컨트롤러 호출X, 오류 페이지로 이동
    • BindingResult가 있는 경우 : 오류 정보를 BindingResult에 담아서 컨트롤러 정상 호출
  • BindingResult 위치는 검증할 대상 바로 다음에 위치
    • 검증할 대상 바로 다음에 위치하기 때문에 어떤 객체를 대상으로 검증하는지 target을 이미 알고 있음

적용 예시

public String Test(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model){..}
FieldError
  • 필드에 오류가 있으면 FieldError 객체를 생성해서 bindingResult에 담아두면 됨

1. 생성자 1

public FieldError(String objectName, String field, String defaultMessage) {}
  • objectName : @ModelAttribute 이름
  • field : 오류가 발생한 필드 이름
  • defaultMessage : 오류 기본 메시지

2. 생성자 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 : 메시지에서 사용하는 인자
  • defaultMessage : 기본 오류 메시지

사용 예시

public String Test(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
    if(!(StringUtils.hasText(item.getItemName()))){
        bindingResult.addError(new FieldError("item", "itemName", item.getItemName(),false, new String[]{"range.item.price"}, new Object[]{1000,1000000}, "상품 이름은 필수입니다."));
    }
}
ObjectError
  • 특정 필드를 넘어서는 오류가 있으면 ObjectError 객체를 생성해서 bindingResult에 담아두면 됨

1. 생성자 1

public ObjectError(String objectName, String defaultMessage) {}
  • objectName : @ModelAttribute 이름
  • defaultMessage : 기본 오류 메시지

2. 생성자 2

 public ObjectError(
            String objectName, 
            @Nullable String[] codes, 
            @Nullable Object[] arguments, 
            @Nullable String defaultMessage
    )
  • codes : 메시지 코드
  • arguments : 메시지에서 사용하는 인자

사용 예시

public String Test(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
	...
    if(resultPrice < 10000){
            bindingResult.addError(new ObjectError("item", null,null,"가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice));
    }
}
rejectValue(), reject()
  • BindingReulst가 제공하는 기능으로 FieldError, ObjectError를 직접 생성하지 않고 간단히 검증 오류를 다룰 수 있음
  • rejectValue : 필드에 대한 에러정보 추가(에러코드 및 메시지, 메시지 인자 전달)
  • reject : 객체에 대한 에러코드 및 메시지, 메시지 인자 전달

rejectValue()

 void rejectValue(
            @Nullable String field, 
            String errorCode,
            @Nullable Object[] errorArgs,
            @Nullable String defaultMessage
    );
  • field : 오류 필드명
  • errorCode : 오류 코드(messageResolver를 위한 오류 코드)
  • errorArgs : 오류 메시지의 {0} 등을 치환하기 위한 값
  • defaultMessage : 오류 메시지를 찾을 수 없을 때 사용하는 기본 메시지

사용 예시

bindingResult.rejectValue("price", "range", new Object[]{100,1000000}, null)

reject()

 void reject(
            String errorCode, 
            @Nullable Object[] errorArgs,
            @Nullable String defaultMessage
    );
  • rejectValue()와 동일

사용 예시

bindingResult.reject("totalPriceMin", new Object[]{10000,resultPrice},null);

'Spring > MVC' 카테고리의 다른 글

Bean Validation  (0) 2024.06.29
Validator  (0) 2024.06.28
Model과 @ModelAttribute  (0) 2024.06.08
@Controller와 @RestController  (1) 2024.06.06
@RequestBody와 @ResponseBody  (0) 2024.06.06