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);
        
    }
}

