-
[07] ApplicationContext - MessageSourceSpring/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로 바뀌는 것을 확인할 수 있습니다.
'Spring > Spring 핵심 기술' 카테고리의 다른 글
[09] ApplicationContext - ResourceLoader (0) 2020.04.21 [08] ApplicationContext - ApplicationEventPublisher (0) 2020.04.19 [06] ApplicationContext - EnvironmentCapable interface (0) 2020.04.16 [05] ApplicationContext - Bean의 scope (0) 2020.04.14 [04] ApplicationContext - @Component와 Component Scanning (0) 2020.04.14