오류 코드와 메세지처리4

shinyeongwoon·2023년 1월 27일
0

Message

목록 보기
9/11

우선 테스트 코드로 MessageCodesResolver를 알아보자.

MessageCodesResolverTest

package hello.itemservice.validation;

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

public class MessageCodesResolverTest {
	MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();
    @Test
    void messageCodesResolverObject() {
    	String[] messageCodes = codesResolver.resolveMessageCodes("required","item");
    	assertThat(messageCodes).containsExactly("required.item", "required");
    }
    
    @Test
    void messageCodesResolverField() {
    	String[] messageCodes = codesResolver.resolveMessageCodes("required","item", "itemName", String.class);
		assertThat(messageCodes).containsExactly(
                "required.item.itemName",
                "required.itemName",
                "required.java.lang.String",
                "required"
        ); 
    }
}

MessageCodesResolver

검증 오류 코드로 메세지 코드들을 생성한다
MessageCodesResolver 인터페이스이고 DefaultMessageCodesResolver는 기본 구현체 이다.
주로 다음과 함께 사용ObjectError,FieldError

DefaultMessageCodesResolver의 기본 메세지 생성 규칙

객체 오류

객체 오류의 경우 다음 순서로 2가지 생성
1. : code + "." + objcet 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 의 로그를 통해서 확인해보자.
codes [range.item.price, range.price, range.java.lang.Integer, range]

FieldError

rejectvlue("itemName","required")
다음 4가지 오류 코드를 자동으로 생성
required.item.itemName
required.itemName
required.java.lang.String
required

ObjectError

reject("totalPriceMin")
다음 2가지 오류 코드를 자동으로 생성
totalPriceMin.item
totalPriceMin

오류 메세지 출력

타임리프 화면을 렌더링 할 때 th:errors 가 실행된다. 만약 이때 오류가 있다면 생성된 오류 메시지 코드를 순서대로 돌아가면서 메시지를 찾는다. 그리고 없으면 디폴트 메시지를 출력한다.

0개의 댓글