본문 바로가기
Legacy/Spring Framework

[스크랩][Spring3 MVC] 국제화(Internationalization) & 현지화(Localization) 예제로 알아보기

by cocyio 2014. 7. 3.

벌써 5번째 글이 되었습니다. 이전 글에서는 Tiles 를 스프링3 MVC에서 설정하고 사용하는 법에 대해서 살펴 봤습니다. Tiles 설정 파일을 정의 하기 위해서 org.springframework.web.servlet.view.tiles2.TilesConfigurer 클래스를 빈 정의하는데 사용 했습니다. 이걸 이용해서 만들었던 HelloWorld 어플리케이션을 헤더와 푸터 메뉴 등으로 나누었습니다. 

이번 파트에서는 스프링3 MVC의 국제화(Internationalization - I18N ) 과 현지화(Localization - L10N ) 에 대해서 알아보도록 하겠습니다.
이번 글 시리즈 내내 만들어왔던 Hello world 어플리케이션에 l10n 에 다라 i18n 기능을 덧붙여 보겠습니다.
소스가 없다면 이전글로 돌아가서 소스를 다운받아 실습하시기를 권해드립니다.

i18n 
과 L10n 이란 무엇인가? 

컴퓨터에서 국제화와 현지화 라는것은, 다른 언어와 지역적인 차이들을 소프트웨어에 적용시킨다는 것을 말합니다.국제화라는 것은 여러가지 다른 언어와 지역적 차이들을 기술적인 변경 없이 소프트웨어에 적용할 수 있도록 설계하는 과정을 말합니다. 현지화 라는 것은 국제화가 된 소프트웨어에 특정 지역이나 언어에 대해서 지역특색의 컴포넌트를 추가한다거나 번역을해서 적용시키는 것을 말합니다.

용어는 i18n 이라고 자주 줄여 씁니다. ( internationalization 이 단어의 첫글자인 i 와 끝글자인 n 사이에 18개의 글자가 있다고해서 i18n 이 됨)
L10n 
에서는 대문자 L을 쓰고 i18n 에서는 소문자 i를 써서  소문자 l 과 대문자 I 가 혼동하는것을 피합니다.

목표

우리의 목표는 국제화, 현지화 기능을 스프링 MVC 어플리케이션에 추가하는 것입니다. 다 끝마치고 나면 다음과 같은모습이 됩니다.

   

두개의 언어지원 기능을 추가 할 겁니다 : 영어와 독일어. 유저가 사용하는 브라우저의 지역적인 세팅에 따라서 적절한 언어가 선택됩니다.
또 유저가 우상단에 있는 언어 선택 링크를 직접 클릭하여 언어를 변경할 수 도 있습니다.

메세지 자원 파일 (Message Resources File)

어플리케이션에서 표시되는 모든 문자를 담게 될 두개의 properties 파일을 만들 것입니다. 이 두개의 파일은"resources" 라고 불리우는 자원 폴더에 저장 할 것입니다. 프로젝트 이름에 마우스 오른쪽 클릭 > New > Source Folder 를 클릭하고 이름을 resources 로 하여 자원 폴더를 만듭니다.

만든 폴더에 messages_de.properties 와 messages_en.properties 두개의 파일을 만들고 아래의 내용을 입력합니다.

File : resources/messages_en.properties

label.lastname=Last Name 
label.email=Email 
label.telephone=Telephone 
label.addcontact=Add Contact  

label.menu=Menu
label.title=Contact Manager 

label.footer=© ViralPatel.net 


File : resources/messages_de.properties

label.firstname=Vorname

label.lastname=Familiename

label.email=Email

label.telephone=Telefon

label.addcontact=Addieren Kontakt 

    

label.title=Kontakt Manager

label.menu=Menü

    

label.footer=© ViralPatel.net


스프링3 MVC에서 국제화(Internatinalization - i18n) 과 현지화( Localization - L10n) 설정해주기

방금 두개의 메시지들이 담긴 파일을 만들었습니다. 이제 이파일들을 스프링 설정에서 지정해 주는 작업을 해야 합니다.
그러기 위해서 org.springframework.context.support.ReloadableResourceBundleMessageSource 클래스를 사용할 것입니다.

또 유저가 직접 언어를 선택할 수 있는 기능도 추가 할 것입니다. 이 기능은 org.springframework.web.servlet.i18n.LocaleChangeInterceptor  클래스를 통해서 구현됩니다. LocaleChangeInterceptor 클래스는 지역적인 차이가 발생됐을 시 이것을 잡아냅니다. 그리고 이 변경 내역은 다음 요청에 대비하기 위해 쿠키에 저장됩니다. 이런 지역적인 변화를 쿠키에 저장하기 위해서 org.springframework.web.servlet.i18n.CookieLocaleResolver 클래스 파일이 사용됩니다.

다음 코드를 spring-servlet.xml 파일에 추가합니다.

File : WebContent/WEB-INF/spring-servlet.xml

view plaincopy to clipboardprint?

  1. <bean id="messageSource"  

  1.     class="org.springframework.context.support.ReloadableResourceBundleMessageSource">   
  2.     <property name="basename" value="classpath:messages" />   
  3.     <property name="defaultEncoding" value="UTF-8"/>   
  4. </bean>   
  5.      
  6. <bean id="localeChangeInterceptor"  
  7.     class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">   
  8.     <property name="paramName" value="lang" />   
  9. </bean>   
  10.      
  11. <bean id="localeResolver"  
  12.     class="org.springframework.web.servlet.i18n.CookieLocaleResolver">   
  13.     <property name="defaultLocale" value="en"/>   
  14. </bean>   
  15.      
  16. <bean id="handlerMapping"  
  17.     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">   
  18.     <property name="interceptors">   
  19.         <ref bean="localeChangeInterceptor" />   
  20.     </property>   
  21. </bean>  



messageSource 
빈 설정의 basename 프로퍼티의 값을 "classpath:messages" 로 설정한 것을 보시기 바랍니다. 
이 설정으로 인해서 스프링은 기본적인 자원파일을 찾을 때, messages_ 로 시작하는 파일을 찾을 것입니다
.

JSP 
화면 변경하기

지금까지 두개의 메세지 파일일을 만들고 스프링에 설정을 완료 해 주었는데 이제 이를 JSP파일에서 사용할 차례이다. 실습하고 있는 어플리케이션의 jsp 파일들을 열고 아래의 내용을 수정한다.

File : WebContent/WEB-INF/jsp/header.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>   
  2.       
  3. <h3><spring:message code="label.title"/></h3>   
  4.       
  5. <span style="float: right">   
  6.     <a href="?lang=en">en</a>   
  7.     |   
  8.     <a href="?lang=de">de</a>   
  9. </span>  



File : WebContent/WEB-INF/jsp/menu.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>    
  2.     
  3. <p><spring:message code="label.menu"/></p>   



File : WebContent/WEB-INF/jsp/footer.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>     
  2.     
  3. <spring:message code="label.footer"/>   



File : WebContent/WEB-INF/jsp/contact.jsp

view plaincopy to clipboardprint?

  1. <br />  
  2. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>   
  3. <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>   
  4. <html>   
  5. <head>   
  6.     <title>Spring 3 MVC Series - Contact Manager</title>   
  7. </head>   
  8. <body>   
  9.       
  10. <form:form method="post" action="addContact.html">   
  11.       
  12.     <table>   
  13.     <tr>   
  14.         <td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td>   
  15.         <td><form:input path="firstname" /></td>   
  16.     </tr>   
  17.     <tr>   
  18.         <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td>   
  19.         <td><form:input path="lastname" /></td>   
  20.     </tr>   
  21.     <tr>   
  22.         <td><form:label path="lastname"><spring:message code="label.email"/></form:label></td>   
  23.         <td><form:input path="email" /></td>   
  24.     </tr>   
  25.     <tr>   
  26.         <td><form:label path="lastname"><spring:message code="label.telephone"/></form:label></td>   
  27.         <td><form:input path="telephone" /></td>   
  28.     </tr>   
  29.     <tr>   
  30.         <td colspan="2">   
  31.             <input type="submit" value="<spring:message code="label.addcontact"/>"/>   
  32.         </td>   
  33.     </tr>   
  34. </table>     
  35.       
  36. </form:form>   
  37. </body>   
  38. </html>  



위의 JSP에서 리소스 파일 에서 메세지를 읽어오기 위해 <spring:message> 태그를 사용했다는 것을 기억하시기 바랍니다.

header.jsp 
파일에서 우리가 기억해야 할 것은, 언어 선택을 위해 2개의 링크를 적어 줬다는 것입니다.
유저가 이 링크를 클릭 했을때, request 의 파라메터를 lang?= 로 설정해 주게 됩니다. 스프링에서는 이 파라메터를 LocaleChangeInterceptor 를 이용해서 가로채고, 적절한 지역 세팅으로 바꾸어 줍니다. 우리가 LocaleChangeInterceptor 클래스를 spring-servlet.xml 파일에 설정 할 때, "param-name" 프로퍼티에 대해서 "lang"이라는 값을 설정해 주었다는 것을 기억하시기 바랍니다.

view plaincopy to clipboardprint?

  1. <property name="paramName" value="lang" />   


따라서 스프링은 "lang" 이라는 이름의 파라메터가 요청에 있는지 찾게 됩니다.

이제 준비 끝!

이제 국제화 & 현지화 기능 추가를 완료했습니다. Alt + Shift + X, R 단축키를 눌러 실행해 봅시다!


소스 코드 다운받기

 Spring3MVC-part5.zip


이 글을 마지막으로 스프링3 MVC 따라하기 번역을 마치도록 하겠습니다.
사실 이 뒤에 스프링3와 하이버네이트 연동하기에 대한 글이 한개 더 있지만, 현재 제가 사용하는 환경이 ibatis 이기때문에
제대로 살펴보지 못했습니다. 기회가 되면 후에 ibatis 연동하는 법에 대해서 글을 올리도록 하겠습니다.

감사합니다.

 

출처 - http://choija.com/212 


'Legacy > Spring Framework' 카테고리의 다른 글

[스크랩] spring 4.x WebSocket  (1) 2014.08.24
[스크랩] spring 3.2 특징  (0) 2014.08.24
spring 메시지 컨버터  (0) 2014.01.27
@ResponseBody 이해하기  (0) 2014.01.27
spring mailSender를 이용한 메일보내기  (0) 2012.10.11