1. MessageCodeResolver
1) 기본 동작
- BindingResult에 저장될 에러 메시지의 키 후보를 생성해두고, messages.properties와 같은 프로퍼티 파일에서 해당 키 값을 찾아 그에 대한 메시지를 에러 메시지로 활용한다.
- 기본 동작을 살펴보자. 아래 예시에서는 messages.properties에 담긴 field.required 값을 에러 메시지로 활용한다.
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "field.required");
fields.required=field required
2) DefaultMessageCodeResolver
- MessageCodeResolver가 기본적으로 사용하는 구현체다.
- 아래와 같은 형태의 4개의 메시지 키 후보를 생성한다. User user 오브젝트를 바인딩하고 검증하는 중에 name이라는 필드 이름과 field.required라는 에러 코드가 BindingResult에 등록되었다고 가정한 경우까지 함께 작성했다.
- 에러코드.오브젝트이름.필드이름 : field.required.user.name
- 에러코드.필드이름 : field.required.name
- 에러코드.타입이름 : field.required.User
- 에러코드 : field.required
※ 우선 순위는 위로 갈 수록 높다.
- 바인딩 작업 중에 타입 변환을 할 수 없어서 오류가 발생하는 경우에는 기본적으로 typeMismatch라는 에러 코드와 함께 디폴트 에러 메시지도 자동으로 등록된다.
2. MessageSource
1) MessageSource 소개
- MessageCodeResolver를 통해 메시지 코드를 가져올 수 있는 방식을 제공한다.
- 코드, 메시지 파라미터 배열, 디폴트 메시지, 지역정보를 활용하여 최종적인 메시지를 만들어준다.
- 기본적으로 bean으로 등록되어 있지 않기 때문에 아래와 같이 직접 bean으로 등록해줘야 한다. Bean의 id로 messageSource를 사용해야 하며, 메시지를 담은 기본 프로퍼티 파일의 이름은 basename 속성으로 지정하면 된다.
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
2) MessageSource의 종류
- ResourceBundleMessageSource : messages.properties 리소스 번들 파일을 사용하여 메시지를 등록
※ messages.properties의 주기적인 갱신이 필요하다면 ReloadableResourceBundleMessageSource를 적용하자.
- StaticMessageSource : 코드로 메시지를 등록
3) 최종 메시지 반영 요소
(1) 코드
- DefaultMessageCodeResolver가 최종적으로 선택한 메시지
(2) 메시지 파라미터 배열
- BindingResult나 Errors의 rejectValue(), reject() 메소드에 있는 Object[] 타입의 파라미터에 해당된다.
- messages.properties에 담긴 메시지에 있는 순서 기반 파라미터에 적용된다. 파라미터를 new Object[] {100}이라고 했다면 아래 예시에서는 "input is higher than 100"이라는 메시지로 완성될 것이다.
field.max=input is higher than {0}
(3) 디폴트 메시지
- BindingResult나 Errors의 rejectValue(), reject() 메소드에 있는 마지막 파라미터에 해당된다.
- DefaultMessageCodeResolver가 어느 메시지도 찾지 못했을 때 사용할 메시지다. 이 경우에 디폴트 메시지마저 지정되지 않았다면 예외가 발생한다.
(4) 지역 정보
- LocaleResolver에 의해 결정된 현재의 지역 정보
- 예를 들어, Locale.KOREAN 지역에 대해서는 messages_ko.properties 파일을 찾고, Locale.ENGLISH 지역에 대해서는 messages_en.properties 파일을 찾는다. 특정 지역에 해당하는 메시지 프로퍼티 파일을 찾지 못했다면 messages.properties에서 메시지를 찾는다.
● 참고 자료 : 토비의 스프링 3.1 Vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] MVC 전용 태그 (0) | 2022.09.29 |
---|---|
[Spring] 메시지 컨버터를 이용하는 Ajax 컨트롤러 (0) | 2022.09.28 |
[Spring] JSR-303 Bean 검증 방식 (0) | 2022.09.25 |
[Spring] 자주 사용되는 WebDataBinder 설정 항목 (0) | 2022.09.22 |
[Spring] 프로퍼티 바인딩 방식(2) - Converter와 Formatter (0) | 2022.09.21 |
댓글