Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section1_6부

whyWhale 2020. 11. 19.

MessageSource

 

국제화 i18n 기능을 제공하는 인터페이스.

 

즉, 메시지 다국화 방법입니다.

예를 들어 각 나라별 언어에 따른 메시지를 각 웹에 지정되어있는 언어마다 다르게 보여줄 수 있습니다.

 

깔금하게 정리하자면 MessageSource를 통해 영어, 한국어, 중국어 등 다양한 언어로 웹 서비스를 제공할 수 있습니다.

 

ApplicationContext extends MessageSource

-

두개의 properties 만들기 
{0} -> 매개변수  

 

각 나라별 properties 명 지정 방법 언더바(_)로 끊어서 작성해주시면 됩니다.

 

AppRunnser 를 만들고 

@Component
public class AppRunner implements ApplicationRunner {
@Autowired
MessageSource messageSource;
// ApplicationContext ctx;


@Override
public void run(ApplicationArguments args) throws Exception {
      out.println( messageSource.getMessage("a",new String[]{"누구누구"}, Locale.KOREA));
      out.println( messageSource.getMessage("a",new String[]{"누구누구"}, Locale.getDefault()));
}

=> 출력으로 서로 다른 msg가 출력될 것입니다!.

정상 출력을 원하시면 a변수를 따로 설정하시고 AppRunner sout 부분에 a->b 하나만 바꾸시면 됩니다.

 

하지만 같은 값이 출력되신다면!

**이마 JVM이 구동될 때 OS 환경 변수 등에서 정보를 읽어 설정하는 것 같습니다. 따라서 사용하시는 운영체제에 설정된 (기본) 언어가 한국어라 그렇게 된거라 추측해 봅니다.**

 

messageSource.getclass() 를 찍어보시면 ResourceBundleMessageSource 출력이 되는데 이것이 빈으로 등록되어 있는 모습을 보실수 있습니다. 그래서 message라는 번들을 담고있어 읽어올수 있는 것입니다.

 

 

또한 리로딩 기능을 가지고 있습니다. 

즉 실행하는 도중에 properties 의 값을 바꾸게 되면 바꾼 값을 축력해주는 기능입니다.

꼭 빌드를 진행해야 합니다.

예를들자면,

 

public void run(ApplicationArguments args) throws Exception {
while (true)
{
out.println( messageSource.getMessage("a",new String[]{"KBY_TECH"}, Locale.KOREA));
out.println( messageSource.getMessage("a",new String[]{"KBY_TECH"}, Locale.getDefault()));
Thread.sleep(1000);   // 이부분만 추가
}
}

 

public static main method 로 돌아가

 

@Bean
public MessageSource messageSource()
{
var source=new ReloadableResourceBundleMessageSource();
source.setBasename("classpath:/messages");
source.setDefaultEncoding("UTF-8");
source.setCacheSeconds(3); // 캐시하는 시간 3초로 두고
return source;
}

 

캐시하는 시간을 3초로 두고 실행시키고 메시지 프로퍼티들의 값을 바꿔 빌드를 진행하시면 다른 msg가 출력됨을 확인 할 수 있습니다.

 

댓글