티스토리 뷰
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (3)
zepinos 2019. 1. 29. 11:172019/01/28 - [Programming/Spring Boot 시작하기] - Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (2)
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 정보를 수작업으로 변경해서 적용되도록 할 수도 있겠지만, 그건 너무 불편합니다.
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; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); interceptor.setParamName("cookie_language"); return interceptor; } }
그래서 Spring 의 LocaleChangeInterceptor 을 Interceptor 에 등록하여 language 을 수동으로 설정할 수 있습니다. URL 의 query string 에 language 정보를 추가하면 해당 언어로 강제로 변경시킬 수 있습니다. 기본 변수명은 lang 이고, 사용자가 수정할 수 있습니다. 또한 HttpMethod 역시 허용 가능한 것을 지정할 수 있습니다. 위에서 생성한 MessageConfig Class 에 LocaleChangeInterceptor 을 재정의해서 매개변수로 넘어오는 값을 이용해 Locale 을 변경할 수 있도록 설정을 해준 뒤 다음과 같이 Interceptor 을 등록합니다.
@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 코드 내에서 언어 정보를 처리할 때에는 그렇지 않습니다.
2019/02/01 - [Programming/Spring Boot 시작하기] - Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (4)
'Programming > Spring Boot 시작하기' 카테고리의 다른 글
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (5) (0) | 2019.02.01 |
---|---|
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (4) (0) | 2019.02.01 |
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (2) (0) | 2019.01.28 |
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (1) (0) | 2019.01.28 |
Spring Boot 실행과 종료 시 특정 동작을 실행하도록 해보기 (2) | 2019.01.25 |
- Total
- Today
- Yesterday
- boot
- 도입기
- Nas
- couchbase
- paging
- java config
- KDE
- git
- 시니어 프로그래머
- messages.properties
- Spring Boot
- 페이징
- 프로젝트 규모
- manjaro
- SI
- NoSQL
- Spring
- Redmine
- 엘지
- RestTemplate
- 클라우드플레어
- Phabricator
- 외장 WAS
- proxmox
- OracleJDK
- jooq
- docker
- Spring MVC
- 워드프레스
- 내장 WAS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |