본문 바로가기
Programming/Spring

[Spring boot] Spring boot에서 다국어 지원하기 (2)

by SpiralMoon 2019. 4. 8.
반응형

 주제 : Spring boot에서 다국어 지원하기 (2).

 

클라이언트의 언어&국가정보를 바탕으로 각기 다른 언어 리소스를 호출하는 방법을 알아보자.

 

▶  관련 문서

Spring boot에서 다국어 지원하기 (1)

 

[Spring boot] Spring boot에서 다국어 지원하기 (1)

▶ 주제 : Spring boot에서 다국어 지원하기 (1). Spring boot에서 클라이언트의 언어&국가정보를 인식하는 방법과 언어&국가정보가 없을 경우에 대해 대처하는 방법을 알아보자. ▶ 관련 문서 ▷ Spring boot에서..

spiralmoon.tistory.com

 

▶  작성 환경

 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의 내용을 읽어들인다. 파일명은 전부 같게 해주자.

properties 파일의 형식은 key-value이다.

리소스 파일의 내용을 채워주자. key=value 형식이다. 한 파일에 채웠으면 나머지 파일들에도 각 언어에 맞게 값을 넣어주자.

intellij에서는 이렇게 리소스를 한 번에 볼 수 있도록 UI가 구성되어 있다.

@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

댓글