Spring이 제공하는 오류메시지 처리 방법이다. 들어가기전에 왜 MessageCodesResolver가 필요할까?
원래 우리가 아는 데로는
BindingResult의 FiledError랑 ObjectError를 보면 매개변수의 오류메시지에 해당하는 codes 부분을 String 배열로 받았었다. 아래 코드 참고하자
public FieldError(String objectName, String field, @Nullable Object
rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable
Object[] arguments, @Nullable String defaultMessage)
마치 aws의 보안그룹 설정처럼 지엽적인 것을 먼저 체크하고 가장 광범위한 것을 다 확인한 후 적용되게끔 설계하는 방식을 취하면 된다.
if (!StringUtils.hasText(item.getItemName())) {
bindingResult.addError(new FieldError("item", "itemName",
item.getItemName(), false, new String[]{"required.item.itemName"}, null, null));
}
그래서 메시지 프로퍼티 설정에도 아래 코드와 같이 먼저 확인할 부분을 지정해놓고 안 걸리면 마지막 광범위한 것 (required)가 적용되게끔 설정 할 수 있다.
#Level1
required.item.itemName: 상품 이름은 필수 입니다.
#Level2
required: 필수 값 입니다.
아래처럼 설계를 하면 required.item.itemName에 해당하는게 없으면 required에 해당하는 메시지가 실행되게끔 할 수 있다!
if (!StringUtils.hasText(item.getItemName())) {
bindingResult.addError(new FieldError("item", "itemName",
item.getItemName(), false, new String[]{"required.item.itemName", "required"}, null, null));
}
근데~~ 스프링의 MessageCodesResolver가 이렇게 귀찮게 설계해야하는 점을 해소해준다!