Internationalization

Presentation Layer의 국제화는 Locale Resolver를 통해 사용할 수 있다. Request가 들어오면 DispatcherServlet는 Locale resolver를 찾게 되고 만약에 있으면 Locale을 설정할 때 사용한다.RequestContext.getLocale() 메소드를 사용해서 Locale resolver에 의해 설정 된 Locale을 가져올 수 있다.

다국어 지원 기능

Spring MVC는 다국어를 지원하기 위하여 Locale Resolver를 가지고 있으며 빈 설정 파일에 정의하지 않을 경우 디폴트로 AcceptHeaderLocaleResolver를 이용한다. 또한 application 사용자들이 원하는 언어를 직접 선택할 수 있도록 구현해야 한다면 CookieLocaleResolver 또는 SessionLocaleResolver를 이용하여 구현한다. application의 화면은 한글만 지원하는 것이 아니라 영어 등의 언어도 지원해야 하므로 메시지를 MessageSource로 추출하여 구현해야한다. Spring MVC에서는 이러한 MessageSource에서 추출한 메시지를 화면에 출력해 줄 수있는 tag 라이브러리를 제공하며 사용 방법은 아래와 같다.
  • Step 1 : properties 파일 작성
  • 각각 언어에 따른 properties파일을 생성하고 출력할 메시지를 작성한다. PropertiesEditor 이클립스 플러그인을 사용하면 쉽게 작성할 수 있다. 다음은 message-user_ko.properties , message-user_en.properties 파일의 일부이다.
    • 한글용 (message-user_ko.properties)
    • title.user.form = 당신의 정보를 입력하세요.
    • 영어용, default용 (message-user.properties, message-user_en.properties)
    • title.user.form = Input your information
  • Step 2 : MessageSource 정의
  • 다음은 messageSource가 정의되어 있는 context-user.xml 파일의 일부이다.
    <bean id="messageSource"
       class="org.springframework.context.support.ResourceBundleMessageSource">
       <property name="basenames">
          <list>
             <!-- properties파일의 이름을 등록한다. 
                                등록되 있지 않을 시에 디폴트로 message.properties파일을 찾는다.-->
             <value>message-user</value>
          </list>
       </property>
    </bean>
  • Step 3: JSP 파일 작성
  • JSP파일에서 등록한 message를 출력하기 위해서 Spring에서 제공하는 태그라이브러리를 등록한 userForm.jsp 파일의 일부이다.
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
    다음과 같이 <spring:message> 태그를 사용하여 메시지를 출력할 수 있다.
    <spring:message code="title.user.form"></spring:message>
    이러한 spring:message 태그의 속성은 다음과 같다.
    속성
    설명
    arguments 부가적인 인자를 넘겨줌. 콤마로 구분된 문자열, 객체 배열, 객체 하나를 넘김.
    argumentSeparator 넘겨줄 인자들의 구분자 설정. 기본값은 콤마.
    code 룩업할 메시지의 키 지정. 지정하지 않으면 text에 입력한 값 출력.
    htmlEscape html 기본 escapse 속성 오버라이딩. 기본값 false.
    javaScriptEscape 기본값 false
    message MessageSourceResolvable 인자로 Spring MVC validation을 거친 errors의 메시지를 쉽게 보여줄 때 사용
    scope 결과 값을 변수에 지정할 때 변수의 scope 지정 (page, request, session, application)
    text 해당 code로 가져온 값이 없을 때 기본으로 보여줄 문자열. 빈 값이면 null 출력.
    var 결과 값을 이 속성에 해당한 문자열에 바인딩 할 때 사용. 빈 값이면 그냥 JSP에 뿌려줌.

Locale Resolver를 이용한 Locale 변경

Locale Resolver를 사용하여 locale을 바꾸고 싶을 때는 setter Injection을 통해 localeResolver를 얻어낸 후 .setLocale()메소드를 통해 locale을 변경해 줄 수 있다. 또한 .resolveLocale(request)메소드를 사용하여 현재 request에 셋팅되어 있는 resolverLocale을 알아낼 수 있다.
public class UserController extends MultiActionController {

	LocaleResolver localeResolver= null;
	
	//setter injection
	public void setLocaleResolver(LocaleResolver localeResolver){
		this.localeResolver = localeResolver;
	}

	protected ModelAndView changeLocale(HttpServletRequest request, HttpServletResponse response) 
		throws Exception {
		//request parameter "locale"에 사용자가 설정한 locale을 가지고 온다.(ex> en, ko)
		Locale locale = new Locale(request.getParameter("locale"));
		//localeResolver에 locale 셋팅
		localeResolver.setLocale(request, response, locale);
		//셋팅된 locale 확인
		System.out.println("current locale from locale resolver ====== " + 
			localeResolver.resolveLocale(request));
		return new ModelAndView("/jsp/result.jsp");
	}

.....생략....

LocaleChangeInterceptor를 이용한 Locale 변경

HandlerMapping에 인터셉터를 등록하여 특정 locale의 요청을 가로채서 특정 파라미터에 넘어 온 값으로 locale을 알아낼 수 있다. 속성 정의 파일내의 LocaleChaneInterceptor정의 예는 다음과 같다.
<bean id="localeResolver"
      class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
      
<bean id="localeChangeInterceptor"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="locale"/>
</bean>

<bean id="urlMapping"
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"/>
        </list>
    </property>
    <property name="mappings">
        <value>/list.do=getUserListController</value>
    </property>
</bean>
여기서는 모든 /list.do 요청을 가로채서 "locale"이라는 request의 파라미터로 locale을 알아낼 수 있다.

Locale Resolver

위의 다국어 지원 예에서 처럼 Spring MVC에서는 Locale Resolver를 사용하여 Locale을 얻어올 수 있으며 이러한 Locale Resolver에는 아래와 같은 것들이 있다.

AcceptHeaderLocaleResolver

사용자의 브라우져에서 보내진 request의 헤더에 accept-language부분에서 Locale을 읽어들인다. 사용자의 OS locale을 나타낸다.
<bean id="localeResolver"
	class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />
AcceptHeaderLocaleResolver는 setLocale() method를 이용한 locale 변경이 불가능하다.

CookieLocaleResolver

사용자의 쿠키에 설정된 Locale을 읽어 들인다. 다음과 같은 속성을 설정할 수 있다.
속성
기본값
설명
cookieName classname + LOCALE 쿠키 이름
cookieMaxAge Integer.MAX_INT 쿠키 살려둘 시간. -1로 해두면 브라우저를 닫을 때 없어짐
cookiePath / Path를 지정해 주면 해당 하는 path와 그 하위 path에서만 참조
<bean id="localeResolver"
	class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
	<property name="cookieName" value="clientlanguage"/>    
	<property name="cookieMaxAge" value="100000"/>
	<property name="cookiePath" value="web/cookie"/>
</bean>

SessionLocaleResolver

requst가 가지고 있는 session으로 부터 locale 정보를 가져온다.
<bean id="localeResolver"
	class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

FixedLocaleResolver

사용자가 특정한 Locale을 지정할 수 있으며 setLocale()메소드를 지원하지 않는다.
<bean id="fixedLocaleResolver"
	class="org.springframework.web.servlet.i18n.FixedLocaleResolver">
	<property name="defaultLocale" value="en"/>
</bean>

Resources

  • 다운로드
  • 이클립스 프로젝트 형태의 샘플 웹 어플리케이션을 포함하고 있는 anyframe-springmvc-sample-basic.zip 파일을 다운받은 후, 테스트 환경 설정 을 참조하여 위에서 제시한 예제 코드를 실행해 볼 수 있다.
    Name
    Download
    anyframe-springmvc-sample-basic.zip
    Download

  • 참고자료