원본 본문으로 이동하기

스프링 i18n (다국어) : 2. Locale Resolver

박용서 - 스프링 i18n (다국어) 시리즈 1. 기본설정 및 타임리프에 적용 - https://gs.saro.me/#!m=elec&jn=797 2. Locale Resolver - https://gs.saro.me/#!m=elec&jn=798 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; } 종류 http://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://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.html - 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 값을 바꿔서 보내거나, 브라우저 설정의 인터페이스 언어 같은 것 을 다른언어로 바꾼뒤에 접근하시면 됩니다. http://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를 인식시킬 수 없는 템플릿엔진에서 사용하시면 될 것 같습니다. 참고 : https://gs.saro.me/#!m=elec&jn=810 - 스프링 자바