현재 프로젝트는 한국어/영어를 지원한다.
기존에는 sessionLocale을 사용해서 개발했었는데, 세션 만료(로그아웃 등)가 되면 사용자가 설정해둔 Locale도 사라져서 기본값으로 표시됬다. sessionLocale을 cookieLocale로 변경했다. 오늘은 그 과정에서 스터디하면서 알게된 Locale 내용을 정리하려고 한다.
LocaleResolver
스프링은 LocaleResolver 객체를 이용해서 웹 요청과 관련된 Locale을 추출하고, 이 Locale 객체를 이용해서 알맞은 언어의 메시지를 선택할 수 있도록 국제화를 지원한다.
@Bean
public LocaleResolver localeResolver() {
/*
* 로그아웃 시 사용자가 설정한 언어가 유지되도록 쿠키로 저장
* */
//SessionLocaleResolver locale = new SessionLocaleResolver();
CookieLocaleResolver locale = new CookieLocaleResolver();
locale.setDefaultLocale(Locale.KOREA); // ko_KR
return locale;
}
스프링이 제공하는 LocaleResolver 구현 클래스
(1) AcceptHeaderLocaleResolver
LocaleResolver를 별도로 설정하지 않을 경우 AcceptHeaderLocaleResolver를 기본 LocalResolver로 사용한다.
AcceptHeaderLocaleResolver는 AcceptLanguage 헤더로부터 Locale 정보를 추출하기 때문에, setLocale() 메서드를 이용해서 Locale 설정을 변경할 수 없다.
(2) CookieLocaleResolver
CookieLocaleResolver는 쿠키를 이용해서 Locale 정보를 저장한다.
setLocale() 메서드를 호출하면 Locale 정보를 저장한다. resolveLocale() 메서드는 쿠키로부터 Locale 정보를 가져온다. Locale 정보를 담은 쿠키가 존재하지 않을 경우, defaultLocale 프로퍼티의 값을 Locale로 사용한다. defaultLocale 프로퍼티의 값이 null이면 Accept-Language 헤더로부터 Locale 정보를 추출한다.
CookieLocaleResolver는 쿠키와 관련해서 별도 설정을 필요로 하지 않지만, 생성할 쿠키 이름, 경로, 유효시간 등의 설정을 직접하고 싶다면 프로퍼티에 알맞게 설정해주면 된다.
※ CookieLocaleResolver의 쿠키 설정 관련 프로퍼티
프로퍼티 | 설명 |
cookieName | * 사용할 쿠키 이름(기본 값: 클래스 이름 + LOCALE) |
cookiePath | * 쿠키 경로(기본값: /) * 값이 지정되면 해당 경로와 하위 경로만 지정 |
cookieMaxAge | * 쿠키 유효 시간(기본 값: 서블릿 컨테이너 기본값) * -1값이 되면 쿠키가 유지되지 않음(클라이언트가 브라우저를 종료할 때까까지만 사용 가능 |
(3) SessionLocaleResolver
SessionLocaleResolver는 세션을 이용하여 Locale 정보를 저장한다. setLocale() 메서드는 세션에 Locale 정보를 저장한다. resolveLocale() 메서드는 세션으로부터 Locale을 가져와 웹 요청의 Locale을 설정한다.
만약 Locale 정보가 세션에 존재하지 않을경우, defaultLocale 프로퍼티의 값을 Locale로 사용한다. defaultLocale 프로퍼티의 값이 null인 경우에는 Accept-Language 헤더로부터 Locale 정보를 추출한다.
(4) FixedLocaleResolver
FixedLocaleResolver는 웹 요청에 상관없이 defaultLocale 프로퍼티로 설정한 값을 웹 요청을 위한 Locale로 사용한다.
FixedLocaleResolver는 setLocale() 메서드를 지원하지 않는다. setLocale() 메서드를 호출할 경우 UnsupportedOperationException 예외를 발생시킨다.
LocaleResolver와 LocaleChangeInterceptor
언어를 변경하고 싶을 때 LocaleResolver와 함께 Imterceptor를 많이 사용한다.(쿠키나 세션의 경우 setLocale()메서드를 이용하는 방법도 있지만, 주로 인터셉터를 이용하는 것 같다.) LocaleResolver는 bean으로 등록되어 있어야한다.
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor locale = new LocaleChangeInterceptor();
locale.setParamName("lang");
return locale;
}
LocaleChangeInterceptor는 url 뒤에 파라미터로 locale 인자값을 넘겨서 언어를 설정한다.
예를들면,
http://localhost:8000?lang=EN
lang 파라미터값을 locale값으로 던져서 설정할 수 있다.
* 참고문헌
https://devbox.tistory.com/entry/Spring-Locale-%EC%B2%98%EB%A6%AC
[Spring] Locale 처리
Locale 처리 스프링 제공하는 커스텀 태그는 웹 요청과 관련된 언어 정보를 이용해서 알맞은 언어의 메시지를 출력한다.웹 브라우저의 언어 설정을 한국어(ko_kr)로 했을 때와 영어(en_us)로 했을 때
devbox.tistory.com
https://oingdaddy.tistory.com/m/349
Spring Locale처리 - SessionLocaleResolver, LocaleChangeInterceptor 사용법
지난번에는 Spring의 기본 LocaleResolver인 AcceptHeaderLocaleResolver 사용법에 대해서 살펴봤다. 이건 메세지만 다국어로 분기를 했을 뿐 아무것도 처리하지 않은 환경에서 사용하기 적합하고 이번에 다
oingdaddy.tistory.com
[Springboot] 쿠키를 이용한 다국어 처리 (i18n)
아이, 십팔..엔
velog.io
'프로그래밍 > Spring, SpringBoot' 카테고리의 다른 글
DI(Dependency Injection) (0) | 2024.05.07 |
---|