ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [07] ApplicationContext - MessageSource
    Spring/Spring 핵심 기술 2020. 4. 17. 09:06
    반응형

    MessageSource는 i18n 기능을 제공하는 interface로써 Message의 다국화 기능을 지원합니다. ApplicationContext는 MessageSource를 상속받으므로 해당하는 모든 기능을 ApplicationContext에서 사용할 수 있습니다.

     

    resources 아래에 "messages_" + Locale + ".properties" file (예: messages_ko_KR.properties)을 생성하고 message key, value pair들을 입력 후 build합니다(message resource 변경 후 build하지 않으면 변경사항이 적용되지 않음에 주의). 이후 Spring application 기동 시 ResourceBundleMessageSource에 의해 message resource들을 자동으로 load합니다. 

     

     

    resources에서 new - Resource Bundle을 차례로 선택하여 Create Resource Bundle 창을 열어줍니다. 

     

     

     

    Create Resource Bundle 창의 Resource bundle base name에 "messages"라고 입력합니다.

     

     

     

    Locale to add의 + button을 click하여 Locale을 입력합니다.

     

     

     

    Create Resource Bundle 창의 OK button을 click하여 messages resource bundle을 생성하면 messages.properties와 messages.ko_KR.properties가 생성됩니다. 각각의 내용을 다음과 같이 입력해 주세요.

     

    <messages.properties>

    title={0} Spring.

     

    <messages.ko_KR.properties>

    title={0} 스프링.

     

    Spring boot가 위에서 생성한 message properties file들을 잘 불러왔는지 확인해보기 위해 runner class를 다음과 같이 만들어 줍니다.

    @Component
    public class AppRunner implements ApplicationRunner {
        @Autowired
        MessageSource messageSource;
    
        public void run(ApplicationArguments args) throws Exception {
            Locale.setDefault(new Locale("en", "US"));
            System.out.println(Locale.getDefault());
    
            System.out.println(messageSource.getMessage("title", new String[]{"Hello "}, Locale.getDefault()));
            System.out.println(messageSource.getMessage("title", new String[]{"Hello "}, Locale.KOREA));
        }
    }

     

    제 컴퓨터에서 테스트할 때 default locale이 ko_KR로 되어 있어 테스트를 위해 default locale을 en_US로 변경 후 테스트를 진행하였습니다. MessageSource bean의 getMessage() method를 통해 원하는 Locale과 key에 필요로 하는 argument를 붙여 String type으로 message를 가져올 수 있습니다.

     

     


     

    Message Resource를 reloadable하게 처리하기

     

    message resource 반환하는 ReloadableResourceBundleMessageSource type의 bean을 새롭게 만들어 build시 message resource를 reload하도록 처리할 수 있습니다.

     

    우선 Application class에서 reloadable한 message resource bean을 선언합니다.

    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
    
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:/messages");	//message resource의 경로를 지정
            messageSource.setDefaultEncoding("UTF-8");	//한글깨짐을 막기위해 encoding을 UTF-8로 지정
            messageSource.setCacheSeconds(3);	//message resource를 3초마다 캐싱하도록 지정
            return messageSource;
        }
    }

     

    테스트를 위해 AppRunner class에서 1초 간격을 두고 message resource를 출력해 봅니다.

    @Component
    public class AppRunner implements ApplicationRunner {
        @Autowired
        MessageSource messageSource;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            Locale.setDefault(new Locale("en", "US"));
    
            while(true) {
                System.out.println(messageSource.getMessage("title", new String[]{"Hello "}, Locale.getDefault()));
                System.out.println(messageSource.getMessage("title", new String[]{"Hello "}, Locale.KOREA));
                System.out.println(messageSource.getMessage("title", new String[]{"Hello "}, Locale.JAPAN));
                Thread.sleep(1000);
            }
        }
    }

     

    Application 실행 중 message resource를 변경하고 build해주면 변경된 resource로 바뀌는 것을 확인할 수 있습니다.

    댓글

Designed by Tistory.