벌써 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?
- <bean id="messageSource"
- class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <property name="basename" value="classpath:messages" />
- <property name="defaultEncoding" value="UTF-8"/>
- </bean>
- <bean id="localeChangeInterceptor"
- class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
- <property name="paramName" value="lang" />
- </bean>
- <bean id="localeResolver"
- class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
- <property name="defaultLocale" value="en"/>
- </bean>
- <bean id="handlerMapping"
- class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
- <property name="interceptors">
- <ref bean="localeChangeInterceptor" />
- </property>
- </bean>
messageSource 빈 설정의 basename 프로퍼티의 값을 "classpath:messages" 로 설정한 것을 보시기 바랍니다.
이 설정으로 인해서 스프링은 기본적인 자원파일을 찾을 때, messages_ 로 시작하는 파일을 찾을 것입니다.
JSP 화면 변경하기
지금까지 두개의 메세지 파일일을 만들고 스프링에 설정을 완료 해 주었는데 이제 이를 JSP파일에서 사용할 차례이다. 실습하고 있는 어플리케이션의 jsp 파일들을 열고 아래의 내용을 수정한다.
File : WebContent/WEB-INF/jsp/header.jsp
view plaincopy to clipboardprint?
- <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
- <h3><spring:message code="label.title"/></h3>
- <span style="float: right">
- <a href="?lang=en">en</a>
- |
- <a href="?lang=de">de</a>
- </span>
File : WebContent/WEB-INF/jsp/menu.jsp
view plaincopy to clipboardprint?
- <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
- <p><spring:message code="label.menu"/></p>
File : WebContent/WEB-INF/jsp/footer.jsp
view plaincopy to clipboardprint?
- <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
- <spring:message code="label.footer"/>
File : WebContent/WEB-INF/jsp/contact.jsp
view plaincopy to clipboardprint?
- <br />
- <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
- <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- <html>
- <head>
- <title>Spring 3 MVC Series - Contact Manager</title>
- </head>
- <body>
- <form:form method="post" action="addContact.html">
- <table>
- <tr>
- <td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td>
- <td><form:input path="firstname" /></td>
- </tr>
- <tr>
- <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td>
- <td><form:input path="lastname" /></td>
- </tr>
- <tr>
- <td><form:label path="lastname"><spring:message code="label.email"/></form:label></td>
- <td><form:input path="email" /></td>
- </tr>
- <tr>
- <td><form:label path="lastname"><spring:message code="label.telephone"/></form:label></td>
- <td><form:input path="telephone" /></td>
- </tr>
- <tr>
- <td colspan="2">
- <input type="submit" value="<spring:message code="label.addcontact"/>"/>
- </td>
- </tr>
- </table>
- </form:form>
- </body>
- </html>
위의 JSP에서 리소스 파일 에서 메세지를 읽어오기 위해 <spring:message> 태그를 사용했다는 것을 기억하시기 바랍니다.
header.jsp 파일에서 우리가 기억해야 할 것은, 언어 선택을 위해 2개의 링크를 적어 줬다는 것입니다.
유저가 이 링크를 클릭 했을때, request 의 파라메터를 lang?= 로 설정해 주게 됩니다. 스프링에서는 이 파라메터를 LocaleChangeInterceptor 를 이용해서 가로채고, 적절한 지역 세팅으로 바꾸어 줍니다. 우리가 LocaleChangeInterceptor 클래스를 spring-servlet.xml 파일에 설정 할 때, "param-name" 프로퍼티에 대해서 "lang"이라는 값을 설정해 주었다는 것을 기억하시기 바랍니다.
view plaincopy to clipboardprint?
- <property name="paramName" value="lang" />
따라서 스프링은 "lang" 이라는 이름의 파라메터가 요청에 있는지 찾게 됩니다.
이제 준비 끝!
이제 국제화 & 현지화 기능 추가를 완료했습니다. Alt + Shift + X, R 단축키를 눌러 실행해 봅시다!
소스 코드 다운받기
이 글을 마지막으로 스프링3 MVC 따라하기 번역을 마치도록 하겠습니다.
사실 이 뒤에 스프링3와 하이버네이트 연동하기에 대한 글이 한개 더 있지만, 현재 제가 사용하는 환경이 ibatis 이기때문에
제대로 살펴보지 못했습니다. 기회가 되면 후에 ibatis 연동하는 법에 대해서 글을 올리도록 하겠습니다.
감사합니다.
출처 - http://choija.com/212
'Hot Tech Reference > 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 |