이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.
스프링 i18n (다국어) 시리즈
Locale Resolver
전장의 Bean 인 localeResolver 에 대해서 알아보겠습니다.
@Bean
public LocaleResolver localeResolver() {
// 세션을 사용한 예제
// SessionLocaleResolver resolver = new SessionLocaleResolver();
// resolver.setDefaultLocale(Locale.KOREAN);
// 쿠키를 사용한 예제
CookieLocaleResolver resolver = new CookieLocaleResolver();
// resolver.setDefaultLocale(Locale.KOREAN); // 기본값 강제 한국어 설정.
resolver.setCookieName("lang");
return resolver;
}
종류
[https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/i18n/package-summary.html
i18n 리졸버는 org.springframework.web.servlet.i18n 에 속해 있고 아래와 같은 종류들이 있습니다.
- AbstractLocaleContextResolver
- AbstractLocaleResolver
- AcceptHeaderLocaleResolver
- CookieLocaleResolver
- FixedLocaleResolver
- SessionLocaleResolver
여기서 주로 쓰이는건 Cookie / Session 이 있습니다.
- AcceptHeaderLocaleResolver
- http의 해더의 Accept-Language 에 의해 선택됩니다.
- 특이하게 setLocale 가 지원되지않습니다. 오직 브라우저 설정에 의해서만 설정된다고 합니다. SessionLocaleResolver
- 처음 들어갈때에는 AcceptHeaderLocaleResolver 처럼 브라우저의 언어 설정에 의한 Accept-Language 로 값이 결정됩니다.
- 물론 setDefaultLocale 을 설정한다면 해당 기본값이 최우선입니다. (다음 문단에서 설명)
- 세션으로 저장되며, 필자의 버전기준으로 org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE 라는 세션 속성이름으로 클래스를 시리얼라이징 되어 저장됩니다. CookieLocaleResolver
- SessionLocaleResolver와 속성이 동일하지만 lang 값이 바뀔경우 세션이 아닌 쿠키에 저장합니다.
- 때문에 세션의 경우 세션이 끊어지면 언어설정이 되돌아오지만 이 리졸버를 이용할 경우 쿠키에 값을 우선으로 불러옵니다.
- 필자의 생각으로는 웬만하면 CookieLocaleResolver 가 나은 것 같습니다. (사용자가 어떤 사이트에 접속할 때마다 언어값이 초기화되어 있다면……..)
LocaleResolver.setDefaultLocale
SessionLocaleResolver 에서도 설명했지만 setDefaultLocale 을 설정할 땐 주의할점이 있습니다. setDefaultLocale을 설정하게되면 해당 값이 의도적으로 설정됩니다. 즉, setDefaultLocale 의 값이 Accept-Language 보다 더 높은 우선순위에 있습니다. 예를들어 영어로 설정한다면 한국어 브라우저로 접속하더라도 기본값이 영어로 설정이 됩니다. 다만 아에 디폴트를 설정하지 않을 경우 Accept-Language 에서 가장 높은 우선순위 값이 기본값으로 설정됩니다. 기본값이 없을때 브라우저별 기본값을 확인해보고 싶으신경우 의도적으로 Accept-Language 값을 바꿔서 보내거나, 브라우저 설정의 인터페이스 언어 같은 것 을 다른언어로 바꾼뒤에 접근하시면 됩니다. [https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/i18n/CookieLocaleResolver.html
확인
이전 강의에선 타임리프(thymeleaf)를 사용해서 확인했지만 이번에는 직접 컨트롤러에서 써보도록 하겠습니다.
- message 파일은 이전강의에서 사용한걸 그대로 사용하도록 하겠습니다.
@Controller public class LocaleController { @Autowired MessageSource messageSource; @ResponseBody @RequestMapping(path = "/locale") public String locale(Locale locale) { String lang = locale.toString(); String home = messageSource.getMessage("home", null, locale); return lang + " : " + home; } }
호스트/locale : 필자의 브라우저 language 우선순위상 ko가 먼저 불렸습니다.
ko_KR : 홈
호스트/locale?lang=en : 영어로 바뀜.
en : home
호스트/locale : 쿠키로 저장되었기 때문에 그대로 영어 출력!!
en : home
다른 템플릿엔진에서 이용
이건 i18n 뿐만아니라 session이나 시큐리틴 같은것도 포함되는 내용으로 타임리프나 JSTL 외에 별도로 tag를 인식시킬 수 없는 템플릿엔진에서 사용하시면 될 것 같습니다. 참고 : 스프링 WebMvcConfigurerAdapter 와 HandlerInterceptorAdapter