코드로 보는 MessageSourceAutoConfiguration

cooper·2023년 10월 12일
0
post-thumbnail

summary

  1. SpringBoot 를 사용한다면 application.properties 를 선언해서 MessageSource 를 관리하자.
    1. MessageAutoConfiguration 은 MessageSource 빈을 선언하지 않으면 자동 설정된다.
    2. application.properties 에서 spring.messages 로 시작하는 property 를 탐색해서 MessageSource 를 생성한다.

1. MessageSource 설정 및 선언 방법

[1] MessageSource 선언 방법

(1) application.properties 선언하는 방법

spring.messages.basename=message/messages
spring.messages.encoding=UTF-8 # default
spring.messages.fallbackToSystemLocale=false

(2) MessageSource Bean 선언

@Configuration
public class MessageSourceConfig {
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("customMessage/messages");
        messageSource.setFallbackToSystemLocale(false);
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }
}

[2] message 선언 방법

  • basename 하위에 message_언어코드_국가코드.properties(.xml) 선언하기

2. MessageSourceAutoConfiguration

[1] META-INF/spring/spring-autoconfigure-metadata.properties

  • META-INF/spring/spring-autoconfigure-metadata.properties 를 확인해보면 MessageSourceAutoConfiguration 이 존재하는 것을 확인


[2] MessageSourceAutoConfiguration 활성 조건 확인

(1) 설정 어노테이션 확인

  • 위치 : org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
@ConditionalOnMissingBean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME, search = SearchStrategy.CURRENT)
  1. messageSource bean 이름이 존재하지 않을 경우
  2. SearchStrategy
    • BeanFactory 계층 구조에서 bean 에 대한 명명된 검색 전략.
    • CURRENT : Search only the current context.

(2) ResourceBundleCondition

[1] getMatchOutcome

  1. basename 을 application.properties(application.yml) 에서 spring.messages.basename 속성에 대한 값을 가져온다. 없을 경우, “messages” 문자열 반환
  2. cache 에 basename 으로 저장된 값이 있는지 확인한다. 만약 저장된 값이 없을 경우, getMatchoutcomeForBasename 을 호출하고 결과 값을 outcome 에 할당한다.
  3. outcome 을 cache 변수에 할당한다.

[2] getMatchoutcomeForBasename

  1. basename 리스트를 만들고 getResources 에 해당 basename 을 담아 호출한다.
  2. getResource() 리턴 값인 Resource 의 값 존재유무를 확인한다.
  3. 존재하는 자원이 있다면, match = true 인 outcome을 반환한다.

[3] getResources

  1. classpath 내에 basename에 해당하는 properties 파일이 있는지 찾아서 반환한다.
  2. classpath 내에 basename에 해당하는 properties 파일이 없다면 자동 설정이 안된다.
    (따라서 messages.properties 와 같은 기본 파일을 설정해두는 것이 좋을 듯 하다.

[3] MessageSource 생성 조건을 확인해보자

  • 위치 : org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
  1. MessageSourceProperties 를 설정하고 MessageSource 을 빈으로 생성한다.

[4] MessageSource : AutoConfiguration vs Custom

(1) AutoConfiguration : properties 기반 설정

spring.messages.basename=message/messages
spring.messages.encoding=UTF-8
spring.messages.fallbackToSystemLocale=false
  1. spring.messages.basename
    • spring message 의 properties 기본 이름
    • e.g. message directory 의 message 로 시작하는 파일(properties or yml) 을 탐색한다는 의미
  2. spring.messages.encoding
    • 인코딩 방식
  3. fallbackToSystemLocale
    • 요청받은 locale 에 대한 메세지 파일이 없을 때, 시스템 locale을 사용할 것인지에 대한 옵션
      • true : 환경설정 언어에 해당하는 영어용 메세지 파일을 가져온다.
      • false : 기본 메세지 파일에서 메세지를 가져온다.

(2) Custom : MessageSource 빈 선언

@Configuration
public class MessageSourceConfig {
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("customMessage/messages");
        messageSource.setFallbackToSystemLocale(false);
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }
}

(3) 결론 : Custom 설정이 우선 순위가 높다.

  • MessageSourceAutoConfiguration 에서 messageSource 이름으로 시작하는 MessageSource 이 있으면 자동 설정이 활성화되지 않기 때문이다.
// 여기
@ConditionalOnMissingBean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME, search = SearchStrategy.CURRENT)
public class MessageSourceAutoConfiguration {
profile
막연함을 명료함으로 만드는 공간 😃

0개의 댓글