[Spring][IoC] MessageSource
2022. 9. 13. 12:05ㆍJAVA/Spring
1. MessageSource란 무엇인가?
- MessageSource는 국제화(i18n) 기능을 제공하는 인터페이스입니다
- 메시지를 다국화하는 방법을 정의합니다.
- 메시지 파일을 모아놓고 각 국가마다 지역화함으로써 각 지역에 맞춘 메시지를 제공할 수 있습니다.
2. 메시지 설정 파일 준비하기
메시지 설정 파일을 준비하기 위해서는 messages.properties 파일들을 준비해야합니다. *.properties 파일에 [파일이름]_[언어]_[국가].properties 형식으로 메시지 파일을 추가합니다.
- messages.properties : 기본 메시지. 시스템의 언어 및 지역에 맞는 프로퍼티 파일이 존재하지 않는 경우에 선택됨
- messages_en_US.properties : 영어 메시지
- messages_kr_KR.properties : 한글 메시지
resources/messages.properties
greeting=Hello. {0}
resources/messages_en_US.properties
greeting=Hello. {0}
resources/messages_kr_KR.properties
greeting=안녕하세요. 반갑습니다. {0}
3. MessageSource 인스턴스에서 지역화된 메시지 얻기
@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[]{"yonghwan"}, Locale.getDefault()));
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.KOREA));
}
}
안녕하세요. yonghwan
Hello. yonghwan
안녕하세요. yonghwan
저같은 경우 Locale의 기본값이 한국어로 되어 있기 때문에 Locale.KOREA의 결과와 동일합니다.
4. ReloadableResourceBundleMessageSource 인스턴스를 통한 MessageSource 리로딩
제목에서 MessageSource 리로딩이란 메시지 프로퍼티를 다시 읽는 것을 의미합니다. 즉, ReloadableResourceBundleMessageSource 인스턴스를 이용하여 메시지 프로퍼티를 다시 읽어서 MessageSource 인스턴스를 생성한다는 의미입니다.
다음 코드는 ReloadableResourceBundleMessageSource 인스턴스를 생성하고 다시 읽을 메시지 프로퍼티가 있는 베이스이름을 설정하고 인코딩 방식과 캐시 유지 시간을 설정하는 코드입니다.
@Configuration
public class MessageSourceConfig {
@Bean
public MessageSource messageSource(){
var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(5);
return messageSource;
}
}
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
MessageSource messageSource;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(messageSource.getClass());
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.getDefault()));
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.KOREA));
System.out.println();
while(true){
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"yonghwan"}, Locale.KOREA));
System.out.println();
Thread.sleep(1000);
}
}
}
class org.springframework.context.support.ReloadableResourceBundleMessageSource
안녕하세요. yonghwan
Hello. yonghwan
안녕하세요. yonghwan
Hello. yonghwan
안녕하세요. yonghwan
Hello. yonghwan
안녕하세요. yonghwan
...
위 실행이 계속 반복되는 중 메시지 프로퍼티 값을 수정하고 프로젝트를 빌드하면 5초후에 메시지 프로퍼티 값이 변경된 것을 볼 수 있습니다.
...
Hello. yonghwan
안녕하세요. yonghwan
Hello. yonghwan
안녕하세요. 반갑습니다. yonghwan
Hello. yonghwan
안녕하세요. 반갑습니다. yonghwan
Hello. yonghwan
안녕하세요. 반갑습니다. yonghwan
...
References
source code : https://github.com/yonghwankim-dev/spring_study/tree/master/spring_message_source/src/main/java/kr/yh
[인프런] 스프링 프레임워크 핵심기술
'JAVA > Spring' 카테고리의 다른 글
[Spring][IoC] ApplicationEventPublisher (0) | 2022.09.23 |
---|---|
[Springboot] 내장 웹 서버(Embedded Web Servers) #1 (0) | 2022.09.23 |
[Spring][IoC] Environment, 프로파일 및 프로퍼티 (0) | 2022.09.01 |
빈(Bean)의 스코프 (0) | 2022.08.31 |
[Spring][IoC] @Autowired 어노테이션 (0) | 2022.08.29 |