2017. 8. 14. 23:21ㆍ공부/웹
다국어 처리를 할 때 여러가지 방법들이 있다.
쿠키를 이용하는 방법, 세션을 이용하는 방법, 파라미터로 날아가는 값을 인터셉터해서 적용하는 방법들이 있다.
이 중 이번에 사용한 방법은 인터셉터로 날아간 것을 세션을 통해서 그 값을 계속 유지시켜 주는 방법이다.
1 2 3 4 5 6 7 8 9 10 11 |
<interceptors> <beans:bean id="localeChangeIntercepter" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <beans:property name="paramName" value="lang"/> </beans:bean> </interceptors> <beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <beans:property name="basenames" value="locale/messages"/> </beans:bean> <beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> <beans:property name="defaultLocale" value="ko"/> </beans:bean> |
이런식으로 servlet-context.xml에 설정을 해준다. 저기서 messageSource는 다국어 처리 파일이 있는 위치를 가르켜 주는
것이고, 저렇게 설정을 해주게 되면 자동으로 fmt로 매칭을 시켜준다?
2번째 줄의 localeChangeIntercepter가 실행이 되면 동시에
sessionLocaleResolver에 값을 넘겨준다.
1 2 3 4 5 6 7 8 9 10 11 12 |
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String newLocale = request.getParameter(this.paramName); if(newLocale != null){ LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); if(localeResolver == null){ throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?"); } localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale)); } return true; } |
하지만 위 코드와 같이 LcaleResolver라는 인터페이스의 객체를 생성하고 있는 것이 보인다. 하지만 상관없다. 자동으로 구현된 클래스를 타고 내려간다.
LocaleResolver -> AbstractLocaleResolver -> SessionlocaleResolver가 상속으로 AbstractLocaleResolver를 받는다.
5번라인의 RquestContextUtils.getLocaleResolver는 리턴타입이 LocaleResolver이다. 그래서 사용이 가능하고.
9번 라인에서 localeResolver.setLocale()은 해당 Locale값 ex) ko,jp,en등등 을 넣어서 처리하게 한다.
1 2 3 |
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale); } |
setLocale은 값을 받아서 세션에 해당 이름으로 저장하게 하는 메소드이다.
여기서 LOCALE_SESSION_ATTRIBUTE_NAME은 SessionLocaleResolver.class.getName() + ".LOCALE" 라는 이름을 갖는데 이는 패키지를 포함한 이름과 뒤에.LOCALE
이라는 세션 ATTRIBUTE 이름으로 들어가게된다.
세션은 특징상 연결이 끊기지 않는 한 계속 유지되는 특성이 있으므로 해당 값을 가지고 해당 언어 셋팅을 유지시켜 준다. 그럼 그 설정된 값은 어떻게 가져와야 하는가?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Override public String getLocale(HttpServletRequest request) { String locale = ""; HttpSession session = request.getSession(false); if(session != null){ String attrName = "org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE"; Object localeValue = session.getAttribute(attrName); if(localeValue == null){ locale = "ko"; }else { locale = localeValue.toString(); } } if(session == null){ locale = "ko"; } return locale; } |
우선 세션값을 사용해야 하므로 4번 라인의 코드를 쳐준다. Request.getSession(flase); 는 세션이 있을 경우에만 값을 리턴한다. 반대로 true인 경우
세션 값이 없으면 새로 생성해서 넣어준다.
자 이제 세션 값을 가져왔다. 그럼 어떻게 해야할까? 간단하다. 세션에 들어가있는 값을 가져오면 된다.
7번라인 코드로 말이다. 그리고 해당 값을 17번 과 같이 리턴해주면 된다.
리턴 값으로 왜 ko, en 등을 갖는지 궁금하지 않는가? 우리가 사용하는 프론트의 여러가지 라이브러리를 보면 대부분 언어 설정하는 옵션이 있다. 그 옵션들은 보통 ko, en 또는 kr_ko 뭐 이런식으로 되어있다.
해당 옵션을 언어처리에 따라서 바꿔줘야 하기 때문에 저 값을 리턴하게 만들었고. jsp로 보내게 넣어준다. 그럼 jsp파일에서는 el태그를 통해서 그냥 보낸 이름 그대로 적어서 언어 선택에 따른 옵션을 따라가게 해준다.
그러면 정상적으로 변경 언어에 맞춰서 라이브러리의 언어도 바꿔서 사용할 수 있다.