⭐ 스프링 MVC는 LocaleResolver를 이용해서 웹 요청과 관련된 Locale을 추출하고, 이 Locale객체를 이용해서 알맞은 언어의 메시지를 선택하게 된다.
1. LocaleResolver 인터페이스
- org.springframework.web.servlet.LocaleResolver 인터페이스는 다음과 같이 정리되어 있다.
package org.springframework.web.servlet;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface LocaleResolver{
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale);
}
: resolveLocale() 메서드는 요청과 관련된 Locale을 리턴한다. DispatcherServlet은 등록되어있는 LocaleResolver의 resolveLocale()메서드를 호출해서 웹 요청을 사용할 Locale을 구한다.
: serLocale() 메서드는 Locale을 변경할 때 사용된다. 예를 들어, 쿠키나 HttpSession에 Locale 정보를 저장할 때 이 메서드가 사용된다.
2. LocaleResolver의 종류
- 스프링이 기본적으로 제공하는 LicaleResolver 구현 클래스는 다음과 같다. 모두 o.s.web.servlet.i18n 패키지에 위치한다.
(1) AcceptHeaderLocaleResolver: 웹 브라우저가 전송한 Accept-Language 헤더로부터 Locale 선택한다. setLocale() 메서드를 지원 하지 않는다.
(2) CookieLocaleResolver: 쿠키를 이용해서 Locale 정보를 구한다. setLocale() 메서드는 쿠키에 Locale 정보를 저장한다.
(3) SessionLocaleResolver: 세션으로부터 Locale 정보를 구한다. serLocale()메서드는 세션에 Locale정보를 저장한다.
(4) FixedLocaleResolver: 웹 요청에 상관없이 특정한 Locale로 설정한다. setLocale() 메서드를 지원하지 않는다.
- LocaleResolver를 직접 등록할 경우 빈의 이름을 "localeResolver"로 등록해주어야 한다.
- AcceptHeaderLocaleResolver : LocaleResolver를 별도로 설정하지 않을 경우AcceptHeaderLocaleResolver를 기본 LocalResolver로 사용한다. AcceptHeaderLocaleResolver는 AcceptLanguage 헤더로부터 Locale 정보를 추출한다. 헤더로부터 Locale 정보를 추출하기 때문에, setLocale() 메서드를 이용해서 Locale 설정을 변경할 수 없다.
- CookieLocaleResolver: CookieLocaleResolver는 쿠키를 이용해서 Locale 정보를 저장한다. setLocale() 메서드를 호출하면 Locale 정보를 담은 쿠키를 생성하고, resolveLocale() 메서드는 쿠기로부터 Locale 정보를 가져와 Locale 정보를 담은 쿠키가 존재하지 않을 경우, defaultLocale 프로퍼티의 값을 Locale로 사용한다. defaultLocale 프로퍼티의 값이 null인 경우에는 Accept-Language 헤더로부터 Locale 정보를 추출한다. CookieLocaleResolver는 쿠티와 관련해서 별도 설정을 필요로 하지 않지만. 생성할 쿠키 이름, 도메인, 경로 등의 설정을 직접하고 싶다면 프로퍼티에 알맞게 설정해주면 된다.
- CookieLocaleResolver의 쿠키 설정 관련 프로퍼티(2)cookieDomain : 쿠키 도메인(4)cookieMaxAge : 쿠키 유효 시간
- (5)cookieSecure : 보안 쿠키 여부. 기본값은 false다.
- (3)cookiePath : 쿠키 경로.기본값은 "/"이다.
- (1)cookieName : 사용할 쿠키 이름
- SessionLocaleResolver : SessionLocaleResolver는 HttpSession에 Locale 정보를 저장한다. setLocale() 메서드를 호출하면 Locale 정보를 세션에 저장하고, resolveLocale() 메소드는 세션으로부터 Locale을 가져와 웹 요청의 Locale을 설정한다. 만약 Locale 정보가 세션에 존재하지 않으면, defaultLocale 프로퍼티의 값을 Locale로 사용한다. defaultLocale 프로퍼티의 값이 null인 경우에는 Accept-Language 헤더로부터 Locale 정보를 추출한다.
- FixedLocaleResolver : FixedLocaleResolver는 웹 요청에 상관없이 defaultLocale 프로퍼티로 설정한 값을 웹 요청을 위한 Locale로 사용한다. FixedLocaleResolver는 setLocale() 메서드를 지원하지 않는다. setLocale()메서드를 호출할 경우 UnsupportedOperationException 예외를 발생시킨다.
3. LocaleResolver를 이용한 Locale 변경
- LocaleResolver를 빈으로 등록했다면, 컨트롤러에서 LocaleResolver를 이용해서 Locale을 변경할 수 있게 된다. 예를 들어 다음과 같이 LocaleResolver를 설정했다고 하자.
<bean class="madvirus.spring.chap07.controller.LocaleChangeController">
<property name="localeResolver" ref="localeResolver" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
- 이 경우 , 컨트롤러 클래스는 다음과 같이 LocaleResolver의 setLocale() 메서드를 호출해서 클라이언트의 웹 요청을 위한 Locale을 변경할 수 있다.
import org.springframework.web.servlet.LocaleResolver;
@Controller
public class LocaleChangeController {
private LocaleResolver localeResolver;
@RequestMapping("/changeLanguage")
public String change(@RequestParam("lang") String language,
HttpServletRequest request, HttpServletResponse response) {
Locale locale = new Locale(language);
localeResolver.setLocale(request, response, locale);
return "redirect:/index.jsp";
}
public void setLocaleResolver(LocaleResolver localeResolver) {
this.localeResolver = localeResolver;
}
- LocaleResolver를 이용해서 Locale을 변경하면, 이후 요청에 대해서는 지정한 Locale을 이용해서 메시지 등을 로딩하게 된다. ResolverContextUtils 클래스는 웹 요청과 관련된 LocaleResolver를 구할 수 있는 메서드를 제공하고 있으므로, 위 코드를 다음과 같이 변경할 수도 있다.
@Controller
public class LocaleChangeController2 {
@RequestMapping("/changeLanguage2")
public String change(@RequestParam("lang") String language, HttpServletRequest request, HttpServletResponse response) {
Locale locale = new Locale(language);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
localeResolver.setLocale(request, response, locale);
return "redirect:/index.jsp";
}
}
'Basic' 카테고리의 다른 글
Git/GitHub 명령어 (0) | 2021.07.17 |
---|---|
프로그래밍언어 기본용어 정리 (0) | 2021.07.16 |