본문 바로가기
Spring|Spring-boot

Spring MessageCodesResolver

by oncerun 2022. 1. 8.
반응형

 

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

댓글