BindingResult의 정의
사용자 입력의 데이터 바인딩 과정에서 발생하는 오류를 관리하고 추적하는 인터페이스 이를 통해 입력 데이터의 유효성 검사 결과를 저장하고, 필요할 때 오류를 쉽게 처리할 수 있도록 도와줍니다.
주의사항
Controller의 함수의 매개변수로 들어가는 BindingResult는 @ModelAttribute이 붙은 매개변수 바로 뒤에 와야 합니다. ex) public String addUser(@ModelAttribute User user, BindingResult bindingResult, …) {…}
오류 상황 추가
1. 필드 오류 - FieldError
// FieldError 생성자 요약
// 1. 간단한 버전
public FieldError(
String objectName,
String field,
String defaultMessage)
// 2. 상세 버전
public FieldError(
String objectName,
String field,
@Nullable Object rejectedValue,
boolean bindingFailure,
@Nullable String[] codes,
@Nullable Object[] arguments,
@Nullable String defaultMessage)
파라미터 정리(간단한 버전)
objectName
:@ModelAttribute
이름field
: 오류가 발생한 필드 이름defaultMessage
: 오류 기본 메시지
파라미터 정리(상세 버전)
objectName
:@ModelAttribute
이름field
: 오류 필드rejectedValue
: 사용자가 입력한 값(거절된 값)bindingFailure
: 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값codes
: 메시지 코드arguments
: 메시지에서 사용하는 인자defaultMessage
: 기본 오류 메시지
// 사용 예시
bindingResult.addError(new FieldError("item", "itemName", "상품 이름은 필수입니다."));
// 오류 발생 시 사용자가 입력한 값을 유지한 버전
// rejectedValue 파라미터를 추가함
bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, null, null, "상품 이름은 필수입니다."))
2. 글로벌 오류 - ObjectError
// ObjectError 생성자 요약
// 1. 간단한 버전
public ObjectError(
String objectName,
String defaultMessage)
// 2. 상세 버전
public FieldError(
String objectName,
@Nullable String[] codes,
@Nullable Object[] arguments,
@Nullable String defaultMessage)
파라미터 정리(간단한 버전)
objectName
:@ModelAttribute
이름defaultMessage
: 오류 기본 메시지
파라미터 정리(상세 버전)
objectName
:@ModelAttribute
이름codes
: 메시지 코드arguments
: 메시지에서 사용하는 인자defaultMessage
: 기본 오류 메시지
// 사용 예시
if (...) {
bindingResult.addError(new ObjectError("item", "총합은 10,000원 이상이어야 합니다."));
}
더 간단한 오류 상황 추가 방법
설명
FieldError나 ObjectError를 사용하지 않아도 가능 BindingResult는 @ModelAttribute 바로 뒤에 나오기 때문에 검증해야 할 객체 대상을 알고 있어서 간단하게 사용이 가능함
1. rejectValue()
void rejectValue(
@Nullable String field,
String errorCode,
@Nullable Object[] errorArgs,
@Nullable String defaultMessage);
파라미터 정리
field
: 오류 필드명errorCode
: 오류 코드(메시지 코드가 아님)errorArgs
: 오류 메시지에서{0}
,{1}
… 을 치환하기 위한 값defaultMessage
: 오류 메시지를 찾을 수 없을 때 사용하는 기본 메시지
// 사용 예시
bindingResult.rejectValue("price", "range", new Object[]{1000, 1000000}, null);
code를 축약할 수 있는 이유
errors.properties
에 range.item.price=가격은 {0} ~ {1} 까지 허용합니다. 라고 작성했을 때 code를 “range.item.price”가 아닌 “price”라고 축약하여 써도 잘 작동합니다.그 이유는 작성한 코드 뒤에 자동으로
.필드명.모델명
이 붙도록 하기 때문입니다.
2. reject()
void reject(
String errorCode,
@Nullable Object[] errorArgs,
@Nullable String defaultMessage);
파라미터 정리
errorCode
: 오류 코드(메시지 코드가 아님)errorArgs
: 오류 메시지에서{0}
,{1}
… 을 치환하기 위한 값defaultMessage
: 오류 메시지를 찾을 수 없을 때 사용하는 기본 메시지
// 사용 예시
bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);