본문 바로가기
Java/Spring

[8] 스프링 프레임워크 핵심 - MessageSource

by Riverandeye 2020. 12. 14.

applicationContext가 가지고 있는 MessageSource 기능을 알아보겠습니다.

MessageSource는 i18n, 국제화와 관련된 기능입니다.

이 기능또한 ApplicationContext 에 넣어놓아 국제화에 대한 기능을 수행 할 수 있습니다.

 

ApplicationContext.getMessage 메소드를 이용해서 메시지 소스를 가져올 수 있는데요

그럼 메세지를 어떤 방식으로 정의를 해야하냐면

스프링 부트를 사용한다면 별다른 설정 필요없이 messages.properties 로 정의해두면 됩니다. 

 

resources 폴더에 다음과 같이 messages.properties와 messages_ko_KR.properties 를 생성합니다. 

 

Message Properties

messages_en_US.properties엔 예시로 greeting=Hello {0} 를 

messages_ko_KR.properties엔 예시로 greeting=아령 {0} 를 작성해줍니다. 

 

 

이제 해당 메세지를 출력하기 위해 MessageSource를 AppRunner에 주입하고

messageSource의 getMessage를 호출할 때 서로 다른 Locale을 넣어 줍니다. 

 

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(messageSource.getMessage("greeting", new String[]{"riverandeye"}, Locale.KOREAN));
        System.out.println(messageSource.getMessage("greeting", new String[]{"riverandeye"}, Locale.US));
        System.out.println(Locale.getDefault());
    }
}

이렇게 하면 간단하게 국가별로 다른 메세지를 리턴하게끔 할 수 있습니다. 

 

국가별로 구분된 메세지

추가적으로, 서버의 중단 없이 메세지를 변경하게끔 할 수 있습니다. 

기본 messageSource 가 아닌 ReloadableResourceBundleMessageSource 를 사용하는 것입니다. 

 

@Bean
public MessageSource messageSource(){
  var messageSource = new ReloadableResourceBundleMessageSource();
  messageSource.setBasename("classpath:/messages");
  messageSource.setDefaultEncoding("UTF-8");
  messageSource.setCacheSeconds(3);
  return messageSource;
}

다음과 같이 메세지 소스를 ReloadableResourceBundleMessageSource 로 정의해주고

메세지의 위치 및 인코딩, 캐싱 시간을 명시해줍니다. 

이제 실시간으로 출력하는 메세지가 달라지는지 while문을 돌려 확인해봅니다.

 

@Override
public void run(ApplicationArguments args) throws Exception {
  while(true){
    System.out.println(messageSource.getMessage("greeting", new String[]{"riverandeye"}, Locale.KOREAN));
    System.out.println(messageSource.getMessage("greeting", new String[]{"riverandeye"}, Locale.US));
    Thread.sleep(1000);
  }
}

간단하게 AppRunner의 run 메소드를 오버라이딩하여 확인해봅니다. 

 

messages의 값을 변경해준 다음에 빌드를 꼭 하셔야 반영됩니다. 

 

 

빌드를 하게 되면 위와 같이 서버가 중단되지 않아도 그 메세지를 변경할 수 있습니다. 

 

댓글