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
);
사용 예시
bindingResult.reject("totalPriceMin", new Object[]{10000,resultPrice},null);