이번시간의 목표는 FieldError와 ObjectError를 조금 더 쉽게 다루는 방법이다. 인자도 너무 많고, 오류코드도 너무 많이 만들어 줘야 한다…
전에말했듯이, BindingResult는 컨트롤러의 인자에서 자신이 바인딩될 Target바로 오른쪽에 온다. 어떻게 보면 이미 자신이 어떤 객체에 바인딩될지 알고 있다.
이런 사실에서 FieldError의 인자를 줄일 수 있지 않을까?
log.info("objectName={}", bindingResult.getObjectName());
log.info("objectTarget={}", bindingResult.getTarget());
이렇게 로그를 찍어보면 이미 bindingResult객체가 바인딩된 객체와 그 이름을 알고 있다는 것을 알 수 있다…
아무것도 입력하지 않아서 값은 다 null이다.
이러면 코드를 더 줄일 수 있지 않을까?
BindingResult객체는 rejectValue()
, reject()
를 제공한다. 이 메서드를 이용하면 FieldError와 ObjectError객체를 생성하지 않아도 검증 오류를 다룰 수 있다.
기존 코드를 단순화 해보자.
//이전
bindingResult.addError(new FieldError("item", "itemName",item.getItemName(), false, new String[]{"required.item.itemName"}, null, "상품 이름은 필수 입니다."));
//이후
bindingResult.rejectValue("itemName", "required");
rejectValue
는 인자가 더 단순해진다. 이미 bindingResult객체가 objectName은 알고 있으므로, 필드와 에러코드, 에러코드 인자만 전해준다.