우당탕탕 개발자 되기
오류 코드 메시지 처리 본문
FieldError, ObjectError 의 생성자
: errorCode, arguments를 제공하는데 오류 발생시 오류 코드로 메시지를 찾기위해 사용
error.properties 파일 생성
- 오류 메시지를 구분하기 쉽게 파일로 관리
-> 스프링 부트에 파일을 인식할 수 있도록 설정 필요
application.properties 에 추가
spring.messages.basename=messages,errors
V1
메시지 처리 전
bindingResult.addError(new FieldError("item", "itemName",
item.getItemName(), false, null, null, "상품 이름은 필수입니다."));
메시지 처리 후
bindingResult.addError(new FieldError("item", "itemName",
item.getItemName(), false, new String[]{"required.item.itemName"}, null,
null));
rejectValue(), reject()
: BindingResult 가 제공하는 rejectValue(), reject() 를 사용하면 FieldError, ObjectError 를 직접 생성하지 않고 깔끔하게 검증 오류를 다룰수 있다.
V2
메시지 처리 후
bindingResult.rejectValue("itemName", "required");
rejectValue()
void rejectValue(@Nullable String field, String errorCode,
@Nullable Object[] errorArgs, @Nullable String defaultMessage);
파라미터
field : 오류 필드명
errorCode : 오류 코드
errorArgs : 오류 메시지에서 {0} 를 치환하기 위한 값
defaultMessage : 오류 메시지를 찾을 수 없을 때 사용하는 기본 메시지
DefaultMessageCodesResolver의 기본 메시지 생성 규칙
객체 오류
객체 오류의 경우 다음 순서로 2가지 생성
1.: code + "." + object name
2.: code
예) 오류 코드: required, object name: item
1.: required.item
2.: required
필드 오류
필드 오류의 경우 다음 순서로 4가지 메시지 코드 생성1.: code + "." + object name + "." + field
2.: code + "." + field
3.: code + "." + field type
4.: code
예) 오류 코드: typeMismatch, object name "user", field "age", field type: int
1. "typeMismatch.user.age"
2. "typeMismatch.age"
3. "typeMismatch.int"
4. "typeMismatch"
ValidationUtils
ValidationUtils 사용 전
if (!StringUtils.hasText(item.getItemName())) {
bindingResult.rejectValue("itemName", "required", "기본: 상품 이름은
필수입니다.");
}
ValidationUtils 사용 후
ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "itemName",
"required");
-> rejectValue() 호출
-> MessageCodesResolver 를 사용해서 검증 오류코드로 메시지 코드들을 생성
-> new FieldError() 를 생성하면서 메시지 코드들을 보관
-> th:errors 에서 메시지 코드들로 메시지를 순서대로 메시지에서 찾고, 노출
Validator 분리
public interface Validator {
boolean supports(Class<?> clazz); //해당 검증기를 지원하는 여부 확인
void validate(Object target, Errors errors); //검증 대상 객체와 BindgingResult
}
WebDataBinder 를통해서 사용
: 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다
@InitBinder
public void init(WebDataBinder dataBinder) {
log.info("init binder {}", dataBinder); dataBinder.addValidators(itemValidator);
}
WebDataBinder에 검증기를 추가하면 해당 컨트롤러에서 검증기를 자동으로 적용
@InitBinder -> 해당 컨트롤러에만 영향을 준다
사용 전
public String addItemV6(@ModelAttribute Item item, BindingResult
bindingResult, RedirectAttributes redirectAttributes)
사용 후
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult
bindingResult, RedirectAttributes redirectAttributes)
'Spring' 카테고리의 다른 글
| Validation(검증) (0) | 2021.10.07 |
|---|---|
| 스프링 통합, 메세지&국제화 (0) | 2021.09.30 |
| 템플릿 (0) | 2021.09.29 |
| 타임리프 (0) | 2021.09.29 |
| Multi-Thread (0) | 2021.09.08 |