▶ 주제 : Spring boot에서 다국어 지원하기 (2).
클라이언트의 언어&국가정보를 바탕으로 각기 다른 언어 리소스를 호출하는 방법을 알아보자.
▶ 관련 문서
▶ 작성 환경
▷ Spring boot 2.0
▶ 방법
Spring에서는 미리 준비해둔 여러 언어 리소스들을 클라이언트의 언어&국가정보에 따라 자동으로 선택하는 기능을 제공한다.
이용할 클래스 목록은 다음과 같다.
첫 번째, Locale. 클라이언트의 언어&국가정보를 표현할 클래스. (이전 글에서 소개하였으니 관련 문서 항목 참조)
두 번째, MessageSource. 여러 언어 리소스를 관리 및 Locale과 함께 사용할 수 있게 해주는 클래스.
▶ MessageSource
MessageSource는 클라이언트의 언어&국가정보(Locale 객체)를 이용해 여러 언어 리소스들을 관리하거나 사용할 수 있게 해주는 클래스로, Bean 등록을 해주어야 사용할 수 있다.
ResourceBundleMessageSource : 개발자가 지정한 path로 여러 리소스 파일들을 인식하며 Locale에 따라 각기 다른 리소스 파일을 선택할 수 있도록 해주는 리소스 로더 클래스.
ReloadableResourceBundleMessageSource : ResourceBundleMessageSource와 기능이 같지만, 지정한 시간마다 리소스 파일을 리로드하여 운영 환경에서도 서버 재배포 없이 업데이트된 리소스 파일을 사용할 수 있게 해주는 클래스.
이번 예시에서는 ReloadableResourceBundleMessageSource를 이용할 것이다. 아무래도 서버 배포 이후에도 리소스를 수정하게 될 상황을 대비하여 ReloadableResourceBundleMessageSource 클래스 사용을 추천한다.
@Configuration
@EnableWebMvc
public class WebConfig {
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
// 언어&국가정보가 없는 경우 미국으로 인식하도록 설정
localeResolver.setDefaultLocale(Locale.US);
return localeResolver;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/message_resource/message");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(180);
// 제공하지 않는 언어로 요청이 들어왔을 때 MessageSource에서 사용할 기본 언어정보.
Locale.setDefault(Locale.US);
return messageSource;
}
}
Bean 등록을 할 때 4가지는 꼭 설정해야한다.
1. 리소스 파일의 경로 (위 코드에서는 message_resoruce가 디렉토리고 message가 리소스 파일이다.)
2. 리소스 파일의 인코딩 타입
3. 리소스를 리로딩할 간격
4. 제공하지 않는 언어로 요청이 들어왔을 때 대신 보여줄 언어
위 코드대로 경로를 설정했다면 이 사진속의 message.properties가 타겟이 된다.
리로스 파일은 .properties 확장자이어야한다.
다른 언어로 된 리소스를 추가해보자. 형식은 파일명_언어코드_국가코드.properties 이다. 이렇게 지어주면 클라이언트가 한국어 리소스를 요청(Locale 객체가 ko_KR)했을 때 messageSource가 알아서 message_ko_KR의 내용을 읽어들인다. 파일명은 전부 같게 해주자.
리소스 파일의 내용을 채워주자. key=value 형식이다. 한 파일에 채웠으면 나머지 파일들에도 각 언어에 맞게 값을 넣어주자.
@Controller
public class testController {
@Autowired
MessageSource messageSource;
@RequestMapping(value = "test", method = RequestMethod.GET)
// Header가 파싱되어 locale을 자동으로 받아옴
public void test (Locale locale) {
String key = "hi";
// locale이 ko_KR이면 message_ko_KR.properties에 접근 => 안녕
// locale이 ja_JP이면 message_ja_JP.properties에 접근 => おはよう
String message = messageSource.getMessage(key, null, locale);
}
}
위 코드는 실제 사용하는 방법이다. messageSource 객체에 key와 locale 객체를 넣어주면 자동으로 리소스를 불러온다.
'Programming > Spring' 카테고리의 다른 글
[Spring boot] Spring boot에서 다국어 지원하기 (1) (0) | 2019.04.02 |
---|
댓글