Spring에서 다국어 적용하기

배세훈·2021년 7월 26일
2

Spring

목록 보기
3/38
  1. 스프링 다국어처리를 이용하려면 controller를 통해서 해당 페이지로 이동하게 해야 한다.

  2. servlet-context.xml에서 다국어 처리부분을 기술

    <beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <benas:porperty name="basenames" value="locale/messages"/>
    </beans:bean>
    <beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    	<beans:property name="defaultLocale" value="ko" />
    </beans:bean>
    
    <mvc:interceptors>
      <beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
          <beans:property name="paramName" value="lang" />
      </beans:bean>
    </mvc:interceptors>
    • ResourceBundleMessageSource 부분이 바로 위에서 저장된 messages 파일들을 읽어오는 부분이다. 해당언어의 파일들이 존재하면 된다. basenames에서 경로/파일명 앞부분을 적어준다.

    • localeResolver에서 다국어처리 방법을 선택한다. localeResolver는 3가지 종류가 있다.

      • 디폴트는 AcceptHeaderLocaleResolver이다. 즉, localeResolver를 별도로 구현하지 않으면 AcceptHeaderLocaleResolver가 브라우저의 설정된 언어값으로 읽어들여 처리한다. 이 값은 변경이 불가능하다. 따라서 사용자가 링크를 통해서 영어, 한국어 등으로 자유롭게 변경하려면 localeResolver를 AcceptHeaderLocaleResolver가 아닌 다른것으로 선언해야 한다.
      • SessionLocaleResolver request가 가지고 있는 session으로 부터 locale정보를 가져온다. session에 있는 값을 가져오되, 만약 값이 없다면 defaultLocale로 설정을 지정할 수 있다. 맨 처음 접근시에는 session값이 없으므로 defaultLocale를 읽게 된다.
      • CookieLocaleResolver는 언어를 변경하고 쿠키에 값을 저장한다.
        <beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
            <beans:property name="cookieName" value="clientlanguage" />
            <beans:property name="cookieMaxAge" value="100000" />
            <beans:property name="cookiePath" value="web/cookie" />
        </beans:bean>
속성 기본값 설명
cookieName classname+locale 저장할 쿠키명
cookieMaxAge -1 -1은 브라우저를 닫으면 지움
cookiePath / 경로를 지정할 수 있음

만약 저장된 쿠키값이 없어서 특정값으로 세팅하고자 한다면 defaultLocale를 추가하면 된다.
<beans:property name="defaultLocale" value="ko" />

SessionLocaleResolver나 CookieLocaleResolver에 defaultLocale이 없다면 브라우저의 언어설정을 따르게 된다.

그렇게 되면 링크를 통해 언어변환처리를 할 수 있다. <mvc:interceptors></mvc:interceptors>로 감싸면 Spring MVC에서 controller를 통해서 접근시 가로채서 LocaleChangeInterceptor를 적용하게 된다.

  1. 다국어 처리를 위해 메시지를 별도의 파일로 분류해야 한다.
    - 경로: src/main/resources/locale
파일명 파일 내용
messages_en.properties hello=Hello
messages_ko.properties hello=안녕하세요

예시 - Spring Boot를 이용한 다국어(MessageSource) 설정하기

WebMvcConfigurer 인터페이스 구현

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;


@Configurer
public class WebMvcConfig implements WebMvcConfigurer{
	
    @Bean
    public ReloadableResourceBundleMessageSource messageSource(){
    	ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
        
        // 메세지 프로퍼티파일의 위치와 이름을 지정한다.
        source.setBasename("classpath:/messages/message");
        
        // 기본 인코딩을 지정한다.
        source.setDefaultEncoding("UTF-8");
        
        // 프로퍼티 파일의 변경을 감지할 시간 간격을 지정한다.
        source.setCacheSeconds(60);
        
        //없는 메세지일 경우 예외를 발생시키는 대신 코드를 기본 메세지로 한다.
        source.setUseCodeAsDefaultMessage(true);
        
        return source;
        
    }
    
    /**
    	변경된 언어 정보를 기억할 로케일 리졸버를 생성한다.
        여기서는 세션에 저장하는 방식을 사용한다.
    */
    @Bean
    public SessionLocaleResolver localeResolver(){
    	return new SessionLocaleResolver();
    }
    
    /**
    	언어 변경을 위한 인터셉터를 생성한다.
    */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
    	LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParameName("lang");
        return interceptor;
    }
    
    /**
    	인터셉터를 등록한다.
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry){
    	registry.addInterceptor(localeChangeInterceptor());
    }
    
}

message 프로젝트 위치 및 파일명

profile
성장형 인간

0개의 댓글