[백업][가리사니] 스프링 i18n (다국어) : 2. locale resolver
java, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

스프링 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
  • 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