본 포스팅은 UTF-8 Filter 적용 및 ViewResolver 설정 이후, 국제화 서비스 제공을 위한 MessageSource 설정 하는 내용입니다.

GIT 주소 : https://github.com/lahuman/SpringBoot.Sample


국제화(Internationalization)란?


사용자의 Locale에 따라 표출되는 언어를 변경하는 서비스 이며, Spring에서는 해당 서비스를 지원하기 위해 MessageSource라는 것을 사용한다.



준비 사항

  • JDK 1.6 이상
  • Gradle 1.11 이상
  • IntelliJ



국제화 서비스를 위한 MessageSource 설정하기


1. Messages.properties 파일 생성하기

resources 폴더 밑에 messages.properties 파일을 생성한다.

파일은 다음과 같은 포멧으로 설정 한다. messages_언어_나라.properties


[파일 목록]



[Resource Bundle로 확인시]


TIP : Properties 파일에서 한글 사용시, 깨질시 Settings에서 아래와 같이 UTF-8 와 체크박스를 선택한다.

Eclipse 에서는 플러그인 설치가 필요 하지만 Intellij에서는 기본적으로 제공한다.




2. Application 에 MessagesSource 설정하기

WebMvcConfigurerAdapter 상속받은 Application 에서 MessageSource 설정을 진행한다.



   @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        //WEB-INF 밑에 해당 폴더에서 properties를 찾는다.
        messageSource.setBasename("messages/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor();
        //request로 넘어오는 language parameter를 받아서 locale로 설정 한다.
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }

    @Bean(name = "localeResolver")
    public LocaleResolver sessionLocaleResolver(){
        //세션 기준으로 로케일을 설정 한다.
        SessionLocaleResolver localeResolver=new SessionLocaleResolver();
        //쿠키 기준(세션이 끊겨도 브라우져에 설정된 쿠키 기준으로)
//        CookieLocaleResolver localeResolver = new CookieLocaleResolver();

        //최초 기본 로케일을 강제로 설정이 가능 하다.
        localeResolver.setDefaultLocale(new Locale("en_US"));
        return localeResolver;
    }

    public void addInterceptors(InterceptorRegistry registry) {
        //Interceptor를 추가 한다.
        registry.addInterceptor(localeChangeInterceptor());
    }


3. JAVA 또는 JSP에서 사용하기

Java에서 MessageSource를 사용하기 위해서는 다음과 같이 MessageSource 를 DI(Dependency Injection) 하여 사용한다.


    @Autowired
    private MessageSource messageSource;

그리고 MessageSource에서 제공되는 다음의 method를 주로 사용한다.



MessageSource Method 인자 설명


code : properties에서 설정한 Key 값

args : Key에 해당하는 Value값에 {0}, {1} 등으로 매핑되는 값

defaultMessage : Key값을 찾지 못할 경우 표출될 값

locale : 지역 코드 값


JAVA 사용 예) 


        String usMessage = messageSource.getMessage("hello.test", null, "no surch", Locale.US); //미국 기준 메시지 요청
        String korMessage = messageSource.getMessage("hello.test",null, "no surch", Locale.KOREA);//한국 기준 메시지 요청
        String localeMessage = messageSource.getMessage("hello.test",null, "no surch", localeResolver.resolveLocale(request)); //현재 설정된 위치 기준의 메시지 요청
        //결과 출력
        log.debug("KR: " + korMessage);
        log.debug("US: " + usMessage);
        log.debug("USER SET: " + localeMessage);
        log.debug("response SET: " + response.getLocale().toString()); //respons에 설정된 위치 정보 출력(불변)

JSP 사용 예)



- Spring taglib를 사용하여 MessageSource 를 쉽게 사용할 수 있다

- Parameter에 language=Locale 을 하게 되면, 위치 정보 properties가 Locale에 맞게 출력된다.


4. 테스트 결과


최초 접속 시)



한글 선택 시)



영어 선택 시)




참고 URL : 

https://gist.github.com/marcaurele/3665696

http://alex-ilies.blogspot.kr/2013/12/internationalization-spring-mvc-with.html

Posted by lahuman

댓글을 달아 주세요