메시지 국제화를 제공하는 인터페이스
💡 국제화(Internationaliztion)?
사용자의 Locale에 따라 표출되는 언어를 변경하는 서비스
*Locale(로케일) : 세계 각 국에서 사용하는 언어, 문자, 화폐 표시, 시간등에 대해 국제화 와 지역화를 통해 어떻게 표시할 지 정의한 매개 변수의 모음
메세지 설정 파일을 모아놓고 각 국가마다 로컬라이징
→ 각 지역에 맞춘 메시지 제공
ex) 한국에서 접속 → 한국어로 출력, 미국에서 접속 → 영어로 출력
ResourceBundle
클래스와 MessageFormat
클래스 기반<property name="cacheSeconds" value="5"/>
프로퍼티 설정으로 reloadingproperties
파일 수정으로 메시지 값 변경 가능MessageSource
의 가장 간단한 구현체메시지 설정 파일 셋업
a. src/main/resources
디렉토리에 [파일이름]_[언어코드]_[국가코드].properties
형식으로 메시지 파일 추가
b. key-value 형식의 값 입력
{index}
: argument가 바인딩 되는 부분메시지 빈 등록
ResourceBundleMessageSource
가 빈으로 자동 등록 @Bean
public MessageSource messageSource() {
var messageSource = new ResourceBundleMessageSource(); //Java 10 이상부터 var 지원
// MessageSource messageSource = new ResourceBundleMessageSource(); //Java 10 이전
messageSource.setBasename("messages"); //메시지 리소스 번들 지정
messageSource.setDefaultEncoding("UTF-8"); //문자 집합 설정 - 한글 깨짐 방지
return 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[]{"java"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"java"}, Locale.KOREA));
}
}
안녕, 진짜 반가워 java
Hello, so good java
@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages"); //basename 설정
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(5); //메시지 소스 캐시하는 최대 시간(초) 설정
return messageSource;
}
📖 참고