MessageCodesResolver
- 검증 오류 코드로 메시지 코드들을 생성한다.
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"
동작 방식 rejectValue() , reject()는 내부에서 MessageCodesResolver를 사용한다. 여기에서 메시지 코드들을 생성한다. FieldError , ObjectError의 생성자를 보면, 오류 코드를 하나가 아니라 여러 오류 코드를 가질 수 있다. MessageCodesResolver를 통해서 생성된 순서대로 오류 코드를 보관한다.
이 부분을 BindingResult의 로그를 통해서 확인해보자.
log.info("BindingResult = {}", bindingResult);
// codes [range.item.price, range.price, range.java.lang.Integer, range]
테스트로 바로 확인해보자 .
required.item.itemName=상품 이름은 필수입니다.
required = 필수 값 입니다.
이는 errors의 properties이다.
public class MessageCodesResolverTest {
MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();
@Test
void messageCodesResolverField() {
String[] messageCodes = codesResolver.resolveMessageCodes("required", "item", "itemName", String.class);
for (String messageCode : messageCodes) {
System.out.println("messageCode = " + messageCode);
}
assertThat(messageCodes).containsExactly("required.item", "required");
}
}
Interface인 MessageCodesResolver의 구현체인 DefaultMessageCodesResolver를 통하여 properties를 읽었다.
Spring은 기본 값보다 구체적인 값을 발견했을 때 구체적인 설정값을 사용한다. 이는 properties에서 값을 가져오는 메커니즘에서도 마찬가지이다. 두 가지 중 더 자세한 required.item을 발견했기 때문에 BindingResult는 다음과 같이 동작한다.
bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false,
new String[]{"required.item.itemName", "required"},
null,
null));
그리고 required.item.itemName의 message가 선택되어 오류 메시지로 출력될 것이다.
추가적으로 Spring은 ValidationUtils라는 유틸 클래스를 제공한다.
이는 간단한 검증은 손쉽게 추가할 수 있다.
ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult,"itemName","required");
// 검증로직
if (!StringUtils.hasText(item.getItemName())) {
bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false , new String[]{"required.item.itemName"}, null,"상품 이름은 필수입니다." ));
bindingResult.rejectValue("itemName", "required", "defaultMessage");
}
모두 동일한 역할을 진행한다.
'Spring|Spring-boot' 카테고리의 다른 글
Spring Formatter (0) | 2022.01.10 |
---|---|
Spring Converter (0) | 2022.01.10 |
Spring Web Validation (2) (0) | 2022.01.08 |
Spring Web Validation (1) (0) | 2022.01.08 |
Spring 메시지, 국제화 (0) | 2022.01.06 |
댓글