applicationContext가 가지고 있는 MessageSource 기능을 알아보겠습니다.
MessageSource는 i18n, 국제화와 관련된 기능입니다.
이 기능또한 ApplicationContext 에 넣어놓아 국제화에 대한 기능을 수행 할 수 있습니다.
ApplicationContext.getMessage 메소드를 이용해서 메시지 소스를 가져올 수 있는데요
그럼 메세지를 어떤 방식으로 정의를 해야하냐면
스프링 부트를 사용한다면 별다른 설정 필요없이 messages.properties 로 정의해두면 됩니다.
resources 폴더에 다음과 같이 messages.properties와 messages_ko_KR.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의 값을 변경해준 다음에 빌드를 꼭 하셔야 반영됩니다.
빌드를 하게 되면 위와 같이 서버가 중단되지 않아도 그 메세지를 변경할 수 있습니다.
'Java > Spring' 카테고리의 다른 글
[12] 스프링 프레임워크 핵심 - SPEL, Null Safety (0) | 2020.12.16 |
---|---|
[9] 스프링 프레임워크 핵심 - ApplicationEventPublisher, ResourceLoader (0) | 2020.12.14 |
[7] 스프링 프레임워크 핵심 - Environment, Profile, Property (0) | 2020.12.05 |
[6] 스프링 프레임워크 핵심 - Component Scan, Bean Scope (0) | 2020.12.05 |
[5] 스프링 프레임워크 핵심 - Autowired (0) | 2020.12.04 |
댓글