IoC 컨테이너 7부 - MessageSource
참고문헌
MessageSource
국제화 (i18) 기능을 제공하는 인터페이스
ApplicationContext extends MessageSource
스프링 부트를 사용한다면, 별다른 설정 필요없이 messages.properties를 사용할 수 있음
스프링부트에 자동으로 빈으로 등록되는 ResourceBundleMessageSource가, messages~로 시작하는 classPath 내의 파일들을 번들로 인식하기 때문
- messages.properties
- messages_ko_kr.properties
예시
//AppRunner.java
@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[]{"keesun"}, Locale.KOREA));
System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.getDefault()));
}
}
//messages.properties
greeting=Hello, {0}
// messages_ko_kr.properties
greeting=안녕, {0}
//출력결과
Hello, keesun
안녕, keesun
Reloading 기능이 있는 메시지 소스 사용하기
- 메시지가 출력되고 있는 와중에, message properties에 있는 메시지 내용을 바꾸고 build하면 3초라는 캐시 타임이 지나고 나서 다시 해당 내용을 읽고 출력을 하게되므로, 출력되는 메시지 내용이 바뀜 (Reloading)
1. MessageSource 빈 커스터마이징
//DemospringApplication.java
@SpringBootApplication
public class DemospringApplication {
public static void main(String[] args) {
SpringApplication.run(DemospringApplication.class, args);
}
@Bean
public MessageSource messageSource() {
var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/message");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3); //메시지 리소스를 최대 3초까지만 caching하고, 다시 읽도록 설정함 (Reloading)
return messageSource;
}
}
2. 1초마다 메시지를 찍도록 한다(확인용).
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
MessageSource messageSource;
@Override
public void run(ApplicationArguments args) throws Exception {
while(true) {
System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.KOREA));
System.out.println(messageSource.getMessage("greeting", new String[]{"keesun"}, Locale.getDefault()));
}
Thread.sleep(1000L);
}
}