- 타입 오류로 Binding에 실패하면 Spring은 FieldError를 생성하면서 사용자가 입력한 값을 넣어둔다. 그리고 해당 오류를 BindingResult에 담아서 컨트롤러에 호출한다.
- 따라서 타입 오류가 같은 Binding 실패시에도 사용자의 오류 메시지를 정상 출력할 수 있다.
- FieldError는 두 가지 생성자를 제공한다.
public FieldError(String objectName, String field, String defaultMessage);
public FieldError(String objectName, String field, @Nullable Object rejeactedValue,
boolean bindingFailure, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage);
첫번째 생성자는 오류가 발생하면 오류 메시지를 출력해주지만 사용자가 입력한 값이 유지되지 못한다.
ex) 가격을 입력하는 필드에 숫자가 아닌 문자가 입력 된다면 가격(Integer)은 문자(String)을 보관할 수 있는 방법이 없다. 때문에 문자로 입력된 값을 보관할 방법이 없어 값을 유지하지 못한다.
때문에 오류가 발생하더라도 사용자가 입력한 데이터 값을 유지할려면 두번째 생성자를 사용해야 한다.
cf) @Nullbale Object rejeactValue가 바로 오류 발생시 사용자 입력 값을 저장하는 필드이다. 우리는 rejectValue를 이용하여 문자로 입력된 값을 보관할 수 있어 값을 유지할 수 있게 되었다.
- objectName : 오류가 발생한 객체 이름
- field : 오류 필드
- defaultMessage : 기본 오류 메시지
- rejectedValue : 사용자가 입력한 값(거절된 값)
- bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값
- codes : 메시지 코드
- arguments : 메세지에서 사용하는 인자