1. 개요

Spring 프레임워크는 다국어 처리가 가능하다.

Locale에 의한 메시지를 사용하여 다국어를 지원하는 것인데 LocaleResolver와 LocaleChangeInterceptor를 사용한다.

  1. LocaleResolver : DispatcherServlet이 LocaleResolver를 통해 사용자의 Locale 식별
  2. LocaleChangeInterceptor : Request의 Locale 정보에 의해 Locale을 변경하고 설정된 LocaleResolver에 Locale 정보 설정

2. LocaleResolver

아래와 같은 종류의 LocaleResolver를 제공한다.

설정 예제는 전자정부 프레임워크 페이지에서 인용했다.

2.1. AceeptHeaderLocaleResolver

디폴트다. 별도로 LocaleResolver를 설정하지 않으면 브라우저의 언어값으로 읽어들입니다..

사용자의 브라우저를 통해 들어온 request의 헤더에서 Accept-Language에서 Locale을 확인한다. 이는 사용자의 OS Locale을 나타낸다.

만약 setLocale()을 사용하면  UnsupportedOperationException이 발생한다.

2.2. CookieLocaleResolver

쿠키 기반으로 Locale을 읽어들인다.

<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>

CookieName은 저장될 쿠키 이름이다.

만약 CookieMaxAge를 -1로 지정하면 브라우저를 닫을 때 쿠키를 지우겠다는 것이다.

CookiePath를 통해서는 쿠키 경로를 지정할 수 있다.

브라우저의 모든 탭이 같은 Locale을 공유한다.

2.3. SessionLocaleResolver

세션 기반의 로케일 정보를 사용하는 것이다. 즉 request가 가지고 있는 Session에 있는 값을 가지고 온다.

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

2.4. FixedLocaleResolver

웹 요청과 상관없이 defaultLocale 프로퍼티를 사용한다. 즉 JVM의 default locale이다.

FixedLocaleResolver는 setLocale() 메소드를 지원하지 않는다. 만약 setLocale()을 사용하면  UnsupportedOperationException이 발생한다.


3. LocaleChangeInterceptor

특정 값으로 Locale을 자동으로 변경하여 LocaleResolver에 담아준다.

사용자는 별도 코드 수정없이 Bean 설정만으로 Interceptor를 탄다.

Request parameter의 경우 LocaleChangeInterceptor의 paramName으로 정의한 이름으로 locale을 지정한다.

LocaleChangeInterceptor의 Bean 설정에서 <property name="paramName" value="locale"/>로 설정했다면, 

http://....../login.do?locale=ko 인 것이다.

예를 한번 더 보자.

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
    p:paramName="language" />

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor" />
        </list>
    </property>
</bean>

위에서 paramName을 language로 설정하였으므로, http://...../login.do?language=en 처럼 사용한다.


4. 메시지

그럼 실제 메세지는 어디에 저장해야 할까?

바로 메세지 프로퍼티 파일인데 이 메세지 프로퍼티는 WEB-INF/messages 폴더 하위에 저장되어 있다. 즉 저장해야 한다.

  • 기본 메세지는 message.properties 파일
  • 한국어 메세지는 message_ko.properties 파일
  • 영문 메세지는 message_en.properties 파일입니다

그리고 메세지 프로퍼티 파일로부터 값을 얻을 때는

message.getMessage(메세지 키값, 대체할 값이 있다면 값의 배열, default 값, locale); 와 같이 사용한다.

JSP의 경우 메시지 메시지 태그를 통해 다음과 같이 가능하다.

alert("<spring:message code="ALERT_MESSAGE"/>")


5. 기타

부록 하나.

i18n이나 l10n 이라는 단어를 들어본 적이 있으신지?

i18n은 international, 즉 국제화를 뜻하고, l10n은 localication, 즉 지역화를 뜻한다.