jingyulog

MessageCodesResolver 본문

Tech/스프링

MessageCodesResolver

jingyulog 2023. 2. 7. 17:42

📌 오류 코드와 메시지 처리

  1. 객체명과 필드명을 조합한 메시지가 있는지 확인한다. (Level 1)
  2. 더 범용적인 메시지를 선택한다. (Level 2)
#Level 1
required.item.itemName: 상품 이름은 필수입니다.

#Level 2
required: 필수 값입니다.

✏️ MessageCodesResolver 개요

  • 검증 오류 코드로 메시지 코드들을 생성한다. (우선순위 적용)
  • MessageCodesResolver는 interface이고, DefaultMessageCodesResolver는 기본 구현체이다.
  • 주로 ObjectError, FieldError 와 함께 사용한다.

📋 DefaultMessageCodesResolver의 기본 메시지 생성 규칙

  • object error (객체 오류)
    • error code + " . " + object name
    • error code
  • field error (필드 오류)
    • error code + " . " + object name + " . " + field
    • error code + " . " + field
    • error code + " . " + field type
    • error code

🔎 동작 방식

  • rejectValue()와 reject()는 내부에서 MessageCodesResolver를 사용한다. 여기에서 메시지 코드들을 생성한다.
  • FieldError와 ObjectError의 생성자를 보면, 여러 오류 코드를 가질 수 있다. 즉, MessageCodesResolver 를 통해서 생성된 순서대로 오류 코드를 보관하는 것이다.
public FieldError(String objectName, String field, @Nullable Object rejectedValue, boolean bindingFailure,
			@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
public ObjectError(String objectName, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
  • 이 부분을 BindingResult의 로그를 통해서 확인해보면 다음과 같다.
codes [range.item.price, range.price, range.java.lang.Integer, range]

TestCode

package hello.itemservice.validation;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.validation.DefaultMessageCodesResolver;
import org.springframework.validation.MessageCodesResolver;

import static org.assertj.core.api.Assertions.*;

public class MessageCodesResolverTest {

    MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();

    @Test
    void messageCodesResolverObject() {
        String[] messageCodes = codesResolver.resolveMessageCodes("required", "item");
        for (String messageCode : messageCodes) {
            System.out.println("messageCode = " + messageCode);
        }
        assertThat(messageCodes).containsExactly("required.item", "required");
    }

    @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.itemName",
                "required.itemName",
                "required.java.lang.String",
                "required"
        );
    }
}

'Tech > 스프링' 카테고리의 다른 글

Validator  (0) 2023.02.07
오류 코드와 메시지 처리  (0) 2023.02.07
메시지와 국제화  (0) 2023.02.07
Spring MVC HTTP 메시지 컨버터  (0) 2023.02.01
JSP와 타임리프 간 foreach 구문 사용법 비교  (0) 2023.01.31