Locale

Dev.Hammy·2024년 3월 26일
0

Spring 아키텍처의 대부분은 Spring 웹 MVC 프레임워크처럼 국제화(internalization)를 지원합니다. DispatcherServlet을 사용하면 클라이언트의 로케일을 사용하여 메시지를 자동으로 resolve할 수 있습니다. 이는 LocaleResolver 개체를 사용하여 수행됩니다.

요청이 들어오면 DispatcherServlet은 로케일 resolver를 찾고, 찾으면 이를 사용하여 로케일을 설정하려고 시도합니다. RequestContext.getLocale() 메소드를 사용하면 로케일 resolver에 의해 resolve된 로케일을 항상 검색할 수 있습니다.

자동 로케일 확인 외에도 인터셉터를 핸들러 매핑(핸들러 매핑 인터셉터에 대한 자세한 내용은 Interception 참조)에 연결하여 특정 상황(예: 요청의 매개변수 기반)에서 로케일을 변경할 수도 있습니다.

로케일 resolver와 인터셉터는 org.springframework.web.servlet.i18n 패키지에 정의되어 있으며 일반적인 방식으로 애플리케이션 컨텍스트에서 구성됩니다. 다음과 같은 로케일 resolver가 Spring에 포함되어 있습니다.

Time Zone

클라이언트의 로케일을 얻는 것 외에도 해당 시간대(time zone)를 아는 것이 유용한 경우가 많습니다. LocaleContextResolver 인터페이스는 resolver가 시간대 정보를 포함할 수 있는 보다 풍부한 LocaleContext를 제공할 수 있도록 하는 LocaleResolver에 대한 확장을 제공합니다.

가능한 경우 RequestContext.getTimeZone() 메서드를 사용하여 사용자의 TimeZone을 얻을 수 있습니다. 시간대 정보는 Spring의 ConversionService에 등록된 모든 날짜/시간 ConverterFormatter 객체에 의해 자동으로 사용됩니다.

Header Resolver

이 로케일 확인자는 클라이언트(예: 웹 브라우저)가 보낸 요청에서 accept-language 헤더를 검사합니다. 일반적으로 이 헤더 필드에는 클라이언트 운영 체제의 로캘이 포함됩니다. 이 resolver는 시간대 정보를 지원하지 않습니다.

Cookie Resolver

이 로케일 확인자는 클라이언트에 존재할 수 있는 Cookie를 검사하여 Locale 또는 TimeZone이 지정되었는지 확인합니다. 그렇다면 지정된 세부 정보를 사용합니다. 이 로캘 resolver의 속성을 사용하면 쿠키 이름과 최대 수명을 지정할 수 있습니다. 다음 예제에서는 CookieLocaleResolver를 정의합니다.

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

	<property name="cookieName" value="clientlanguage"/>

	<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
	<property name="cookieMaxAge" value="100000"/>

</bean>

다음 표에는 CookieLocaleResolver 속성(property)이 설명되어 있습니다.

Session Resolver

SessionLocaleResolver를 사용하면 사용자 요청과 연결될 수 있는 세션에서 LocaleTimeZone을 검색할 수 있습니다. CookieLocaleResolver와 달리 이 전략은 로컬에서 선택한 로케일 설정을 서블릿 컨테이너의 HttpSession에 저장합니다. 결과적으로 이러한 설정은 각 세션마다 일시적이므로 각 세션이 종료되면 손실됩니다.

Spring Session 프로젝트와 같은 외부 세션 관리 메커니즘과 직접적인 관계가 없다는 점에 유의하세요. 이 SessionLocaleResolver는 현재 HttpServletRequest에 대해 해당 HttpSession 속성을 평가하고 수정합니다.

Locale Interceptor

HandlerMapping 정의 중 하나에 LocaleChangeInterceptor를 추가하여 로케일 변경을 활성화할 수 있습니다. 요청에서 매개변수를 감지하고 이에 따라 로케일을 변경하여 디스패처의 애플리케이션 컨텍스트에서 LocaleResolversetLocale 메소드를 호출합니다. 다음 예에서는 siteLanguage라는 매개변수가 포함된 모든 *.view 리소스에 대한 호출이 이제 로케일을 변경함을 보여줍니다. 예를 들어, www.sf.net/home.view?siteLanguage=nl이라는 URL을 요청하면 사이트 언어가 네덜란드어로 변경됩니다. 다음 예에서는 로케일을 가로채는 방법을 보여줍니다.

<bean id="localeChangeInterceptor"
		class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
	<property name="paramName" value="siteLanguage"/>
</bean>

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

<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="interceptors">
		<list>
			<ref bean="localeChangeInterceptor"/>
		</list>
	</property>
	<property name="mappings">
		<value>/**/*.view=someController</value>
	</property>
</bean>

0개의 댓글