Spring 다국어 처리 방법(과정)을 알아보자.

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>

Colored by Color Scripter

cs

 

이런식으로 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;

    }

Colored by Color Scripter

cs

 

하지만 코드와 같이 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);

    }

Colored by Color Scripter

cs

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;

    }

Colored by Color Scripter

cs

 

 

우선 세션값을 사용해야 하므로 4 라인의 코드를 쳐준다. Request.getSession(flase); 세션이 있을 경우에만 값을 리턴한다. 반대로 true 경우

세션 값이 없으면 새로 생성해서 넣어준다.

이제 세션 값을 가져왔다. 그럼 어떻게 해야할까? 간단하다. 세션에 들어가있는 값을 가져오면 된다.

7번라인 코드로 말이다. 그리고 해당 값을 17 같이 리턴해주면 된다.


리턴 값으로 왜 ko, en 등을 갖는지 궁금하지 않는가? 우리가 사용하는 프론트의 여러가지 라이브러리를 보면 대부분 언어 설정하는 옵션이 있다. 그 옵션들은 보통 ko, en 또는 kr_ko 뭐 이런식으로 되어있다. 

해당 옵션을 언어처리에 따라서 바꿔줘야 하기 때문에 저 값을 리턴하게 만들었고. jsp로 보내게 넣어준다. 그럼 jsp파일에서는 el태그를 통해서 그냥 보낸 이름 그대로 적어서 언어 선택에 따른 옵션을 따라가게 해준다.

그러면 정상적으로 변경 언어에 맞춰서 라이브러리의 언어도 바꿔서 사용할 수 있다.