티스토리 뷰

반응형

2019/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)


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함