본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] 프로퍼티 파일에서 BindingResult 메시지 관리하기

by 김코더 김주역 2022. 9. 25.
반응형

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

반응형

댓글