LocaleResolver와 LocaleChangeInterceptor를 이용한 다국어 변경
메시지 리소스 파일을 읽어 로케일에 따라 각 언어에 맞게 출력이 가능한 LocaleResolver와
다양한 언어를 자유롭게 선택해서 변경 가능한 LocaleChangeInterceptor를 공부해봅니다.
LocaleResolver 환경 설정
스프링 MVC는 LocaleResolver를 이용해서 로케일을 추출해 알맞은 언어로 페이지에
출력이 가능합니다.
다시 말해서 디스패치 서블릿은 웹 요청이 들어올 시 LocaleResolver를 검색합니다.
로케일 객체를 검색해서 이를 이용해 로케일을 설정합니다.
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.LocaleResolver 구현체">
<property name="defaultLocal" value="로케일 언어"/>
...
</bean>
다음은 빈 객체로 설정 가능한 LocaleResolver 구현체 유형입니다.
유형 | 설명 |
AcceptHeaderLocaleResolver | 웹 브라우저에 설정된 기본 로케일 정보 사용 HTTP 요청 accept-language 헤더에 지정된 기본 로케일 사용 |
CookieLocaleResolver | 쿠키를 이용한 로케일 정보 사용 사용자 지정 로케일, 표준 시간대 정보를 브라우저 쿠키로 유지 |
SessionLocaleResolver | 세션을 이용한 로케일 정보 사용 사용자 세션에서 locale 속성을 사용하여 기본 로케일 또는 요청의 accept-header 로케일로 대체 |
FixedLocaleResolver | 특정 로케일 지정 항상 고정된 기본 로케일을 반환하고 선택적으로 시간대 반환 |
CookieLocalResolver와 SessionLocaleResolver는 로케일에 따라 원하는 언어를
선택하여 서비스 가능합니다.
그러나 FixedLocaleResolver는 로케일과 상관없이 지정된 언어만을 서비스합니다.
다음은 LocaleResolver 빈 객체 CookieLocaleResolver를 servlet-context.xml에 등록하는 예시입니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans...>
...
<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="defaultLocale" value="ko"/>
</beans:bean>
</beans:beans>
프로퍼티에 쿠키 이름과 쿠키 최대 유지 시간을 설정합니다.
쿠키 이름은 clientlanguage이고 쿠키 유지 시간은 10초로 설정했습니다.
쿠키 유지 시간을 기본값인 -1로 설정하면 웹 브라우저를 닫을 때 쿠키를 유지하지 않고
삭제합니다.
defaultLocale 프로퍼티가 없다면 웹 브라우저의 언어 설정을 따르게 됩니다.
위에 CookieLocaleResolver 빈 객체를 등록하고 다음과 같이 컨트롤러를 작성해줍니다.
package com.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Example02Controller {
@RequestMapping("/exam02")
public String requestMethod() {
return "webpage12_01";
}
}
쿠키를 이용한 로케일 정보를 사용함으로 ko로 설정된 뷰 페이지가 출력될 것입니다.
LocaleChangeInterceptor를 이용한 로케일 변경
LocaleChangeInterceptor 클래스를 이요하면 로케일을 변경하는 별도의 컨트롤러 클래스 구현 없이
메시지를 해당 언어로 변경이 가능합니다.
웹 요청의 매개변수를 사용해서 로케일을 변경할 수 있습니다.
LocaleChangeInterceptor 클래스는 servlet-context.xml파일의 <interceptors> 요소에 등록하면
디스패처 서블릿이 컨트롤러에 접근할 때
응답을 가로채서 LocaleChangeInterceptor를 적용할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans...>
...
<interceptors>
<beans:bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="language"/>
</beans:bean>
</interceptors>
</beans:beans>
웹 요청 URL에 '?language=언어 값'을 붙여서 사용합니다.
요청 매개변수를 포함해서 요청이 들어오면 언어 값이 ko면 한국어로, en이면 영어로 변환하여 처리합니다.
다음은 LocaleChangeInterceptor 클래스를 사용한 예시입니다.
package com.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Example03Controller {
@RequestMapping("/exam03")
public String requestMethod() {
return "webpage12_02";
}
}
마찬가지로 컨트롤러는 다음과 같이 구현해주고
뷰 페이지를 다음과 같이 작성해주어 매개변수를 각기 다르게 설정해줍니다.
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
<title>Internationalization</title>
</head>
<body>
<h2>다국어 처리</h2>
<p><a href="?language=ko">Korean</a>|<a href="?language=en">English</a>
<p><spring:message code="Person.form.Enter.message"/>
</body>
</html>
/exam03을 실행하면 다음과 같은 페이지가 나옵니다.
Korean을 클릭하면 URL의 매개변수가 ko로 변경되고 로케일이 ko로 설정됩니다.
English를 클릭하면 URL의 매개변수가 en으로 변경되고 로케일이 en으로 설정됩니다.
로케일에 따라 그에 알맞은 메시지 리소스 파일을 불러오는 것을 확인할 수 있습니다.
'SPRING' 카테고리의 다른 글
[SPRING]#48 도서 쇼핑몰 구현 (유효성 검사1) (0) | 2024.01.21 |
---|---|
[SPRING]#47 도서 쇼핑몰 구현 (다국어 처리4) (0) | 2024.01.21 |
[SPRING]#45 도서 쇼핑몰 구현 (다국어 처리2) (0) | 2024.01.20 |
[SPRING]#44 도서 쇼핑몰 구현 (다국어 처리1) (0) | 2024.01.20 |
[SPRING]#43 도서 쇼핑몰 구현 (로그 기록6) (0) | 2024.01.18 |