원래 ResourceBundleMessageSource 빈을 등록해야 사용할 수 있지만 스프링 부트는 자동으로 실행해준다.
직접 정의하는 방법
ReloadableResourceBundleMessageSource를 이용해 직접 정의하는 방법도 있다.
@SpringBootApplicationpublicclassMessageSourceApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(MessageSourceApplication.class, args); } @Bean// 빈 이름은 항상 messageSource가 되어야 한다.publicMessageSourcemessageSource() {var messageSource =newReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:/messages");// 한글이 깨지므로 인코딩 해준다.messageSource.setDefaultEncoding("UTF-8");return messageSource; }}
안녕, keesun
hello keesun
메시지 리로딩
중간에 메시지를 수정하면 수정한 내용이 출력된다.
@ComponentpublicclassAppRunnerimplementsApplicationRunner { @AutowiredMessageSource messageSource; @Overridepublicvoidrun(ApplicationArguments args) throwsException {while (true) {// message_ko_KR.propertiesSystem.out.println(messageSource.getMessage("greeting",newString[]{"keesun"},Locale.KOREA));// messages.properties// OS 기본 언어 설정에 기반하기 때문에 나는 한국어로 출력된다.System.out.println(messageSource.getMessage("greeting",newString[]{"keesun"},Locale.getDefault()));// 1초마다 기록한다.Thread.sleep(1000L); } }}
먼저 메시지가 1초마다 기록되게 만든다.
@SpringBootApplicationpublicclassMessageSourceApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(MessageSourceApplication.class, args); } @Bean// 빈 이름은 항상 messageSource가 되어야 한다.publicMessageSourcemessageSource() {var messageSource =newReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:/messages");// 한글이 깨지므로 인코딩 해준다.messageSource.setDefaultEncoding("UTF-8");// 리소스를 캐시하는 시간을 3초로 설정한다.messageSource.setCacheSeconds(3);return messageSource; }}
그리고 3초마다 캐시를 하게 한 뒤
greeting=안녕, 반갑습니다. {0}
프로퍼티를 수정하고 Build Project(F9) 하면 수정 내용이 실시간으로 반영된다.