쌓고 쌓다

MessageCodesResolver 본문

프로그래밍/spring

MessageCodesResolver

승민아 2023. 8. 30. 15:24

MessageCodesResolver? 그게 뭔데

errors.properties

#Level1
required.item.itemName=상품 이름은 필수입니다.

#Level2
required=필수 값 입니다.

"required" 에러 코드(errorCode)를 만들때

"required.item.itemName"처럼 메시지를 세밀하게 만들 수 있고

"required"처럼 메시지를 단순화하여 사용할 수 있다.

 

단순화한 메시지는 넓게 사용이 가능하나. 세밀한 메시지는 좁은 범위에서 사용이된다.

즉, 에러 코드만으로 좁은 범위에서 넓은 범위로 메시지를 찾으며

우선순위에 맞춰 메시지를 찾아 사용할 수 있다.

 

스프링은 MessageCodesResolver가 위의 우선순위에 맞춰 메시지를 찾는 기능을 제공한다.

 

MessageCodesResolver

MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();

1. 객체 에러
String[] messageCodes = codesResolver.resolveMessageCodes("required", "item");
// messageCodes: ["required.item", "required"]

2. 필드 에러 
String[] messageCodes2 = codesResolver.resolveMessageCodes("required", "item", "itemName", String.class);
// messageCodes2: ["required.item.itemName", "required.itemName", "required.java.lang.String", "required"]
// String.class는 에러 필드의 타입을 넣어줌

String 배열에 담긴 값들을 보면 알겠지만

MessageCodesResolver는 에러 코드로 메시지 코드들을 생성해준다.

 

생성된 메시지 코드들에는 규칙이 있다.

객체 에러
1. code + "." + object name
2. code

필드 에러
1. code + "." + object name + "." + field
2. code + "." + field
3. code + "." + field type
4. code

 

MessageCodesResolver는 언제 쓰여?

BindingResult의 rejectValue(필드 에러 추가), reject(객체 에러 추가) 메서드 내부에서 MessageCodesResolver를 사용한다.

이 메서드에 에러 코드와 필드를 넘겨주면 메시지 코드들을 만들어 FieldError, ObjectError 생성시 보관한다. 

BindingResult rejectValue, reject: https://non-stop.tistory.com/573

 

우리가 타임리프에서 오류 메시지 출력시 아래의 코드를 사용한다.

<div class="field-error" th:errors="*{itemName}">
    상품명 오류
</div>

th:errors는 해당 필드에 에러가 있다면 생성된 메시지 코드들을 돌며 메시지를 찾아 출력한다.

만약 없다면 defaultMessage를 출력한다.

 

정리하자면

  1. rejectValue, reject 호출
  2. MessagCodesResolver를 이용해 에러 코드로 여러 메시지 코드를 생성
  3. new FieldError() 생성하며 메시지 코드들 보관
  4. th:errors에서 메시지 코드들로 메시지를 찾고 있으면 출력
Comments