zepinos
18k
2019-01-29 11:23:19 작성 2019-01-29 11:23:36 수정됨
2
1190

Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (3)


제 블로그에 올린 글을 퍼왔습니다.


쓸데없는 내용이 많아서 포스트를 나눠 적고 있는데, 아래에는 1편만 올렸다가 2편까지만 보셨을 분들이 계실꺼 같아서 오늘 올린 3편에 대한 내용도 올립니다. 오늘 중으로 4편도 쓸 계획인데, 4편은 제 블로그에서 계속 봐주시면 고맙겠습니다.


덤으로, okky 는 별도의 후원금이 없이 운영되다 보니 항상 자금이 부족하다고 합니다. okky 의 구글 광고를 그냥 구경만 하지 마시고 한 번씩 눌러주시면 okky 에 큰 도움이 될 것 같습니다. 제 블로그 광고의 클릭도 굽신굽신... -_-;;;


https://zepinos.tistory.com/44




Spring Boot 에서는 org.springframework.web.servlet.LocaleResolver 인터페이스를 @Bean 으로 재정의하여 사용자의 언어를 어떻게 관리할 것인지 변경할 수 있습니다. FixedLocaleResolver, CookieLocaleResolver, SessionLocaleResolver 와 같은 구현체가 존재하는데 개인적으로 가장 많이 이용한다고 생각되는 CookieLocaleResolver 에 대해서 살펴보겠습니다.


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;

import java.util.Locale;

@Configuration
public class MessageConfig {

    @Bean
    public LocaleResolver localeResolver() {

        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setCookieName("cookie_language");
        resolver.setCookieDomain(".test.com");
        resolver.setDefaultLocale(Locale.KOREA);

        return resolver;

    }

}



위와 같이 간단하게 설정할 수 있습니다. 코드만 봐도 대충 어떠한 것을 설정할 수 있는지 알 수 있습니다.

사용자 브라우져에 저장할 쿠키의 key 명
사용자 브라우져에 저장할 쿠키의 상태 정보 : Domain, MaxAge 등
기본 Locale

실제로 LocaleResolver 을 @Bean 으로 등록한 뒤 브라우져로 접속하면 쿠키가 생성되어 있음을 확인할 수 있습니다.

그렇다면, 사용자의 언어를 항상 브라우져의 설정을 이용해서 바꿔야 할까요? 물론 위와 같이 Cookie 에 정보를 저장한다면 개발자 도구 혹은 사용자 장비의 Cookie 정보를 수작업으로 변경해서 적용되도록 할 수도 있겠지만, 그건 너무 불편합니다.

그래서 Spring 의 LocaleChangeInterceptor 을 Interceptor 에 등록하여 language 을 수동으로 설정할 수 있습니다. URL 의 query string 에 language 정보를 추가하면 해당 언어로 강제로 변경시킬 수 있습니다. 기본 변수명은 lang 이고, 사용자가 수정할 수 있습니다. 또한 HttpMethod 역시 허용 가능한 것을 지정할 수 있습니다.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final LocaleChangeInterceptor localeChangeInterceptor;

    @Autowired
    public WebMvcConfig(LocaleChangeInterceptor localeChangeInterceptor) {
        this.localeChangeInterceptor = localeChangeInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
        localeChangeInterceptor.setParamName("language");
        localeChangeInterceptor.setHttpMethods("GET");
        
        registry.addInterceptor(localeChangeInterceptor);

    }

}

실제로 제가 일하는 곳에서는 모바일앱에서 Cookie 로 언어 정보를 보내고 Backoffice 에서는 parameter 로 언어 정보를 보냅니다.

다만, 이 경우 주의할 것이 있습니다.
우리가 흔히 한국어를 표현할 때 ko 라고 표현하지만 국가와 함께 표현할 때에는 ko_KR, ko-KR, koKR 등 여러가지 표현 방법이 있습니다. 그리고 표준 기구에서 제정한 문서에 따라 어떤게 표준인지 확인하고 그것만 사용할 때에도 있습니다. 그런데, 여러 표준 문서에서 제각각 다르게 정의한 경우도 있는데, ko_KR 와 ko-KR 모두 표준 문서에서 정의된 형태라는 것입니다.
한국은 그래도 ko_KR 하나이지만, en_US 와 en_GB 처럼 같은 언어에 다른 지역일 경우도 존재하고, 이걸 이용해서 사용자의 표준시간대까지 파악해야 할 때도 있을 경우도 있습니다. 다행이 Spring 내에서는 조화롭게 처리되지만, Java 코드 내에서 언어 정보를 처리할 때에는 그렇지 않습니다.


출처: https://zepinos.tistory.com/44  [zepinos BLOG]

1
0
  • 댓글 2

  •  
    1k
    2019-01-31 10:58:43

    감사합니다

    0
  • zepinos
    18k
    2019-02-01 12:36:46

    내용에서 좀 빠진게 있어서 블로그에서 보강을 했습니다. 4편도 올라갔고, 5편까지 적을 계획입니다.


    참고해주세요.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.