Spring Boot는 메시지 로컬화를 지원해서 애플리케이션을 서로 다른 언어 선호를 가진 유저들에게 맞춰 줄 수 있다. 기본적으로 Spring Boot는 classpath의 root에서 메시지 리소스 번들이 있는지 찾는다.
자동 구성은 구성된 리소스 번들의 기본 properties 파일(예:messages.properties)이 사용가능할 때 적용된다. 리소스 번들에 언어별 속성 파일만 포함되어 있으면 기본값을 추가해야 한다. 구성된 기본 이름과 일치하는 속성 파일이 없으면 자동으로 구성된 메시지 소스가 없다.
spring.messages.basename=messages,config.i18n.messages
spring.messages.fallback-to-system-locale=false
아래와 같은 message 속성을 지정할 수 있다.
속성 | 기본값 | 설명 |
---|---|---|
spring.messages.basename | messages | message 파일 이름 설정. comma로 구분하여 여러 이름을 설정가능 |
spring.messages.encoding | UTF-8 | 인코딩 방식 |
spring.messages.cache-duration | 캐시 주기 설정, 기본값 forever | |
spring.messages.fallback-to-system-locale | true | 감지된 파일이 없는 경우 (true) system locale 사용, (false) messages.properties 파일 사용 |
spring.messages.always-use-message-format | false | MessageFormat을 전체 메시지에 적용할 것인지 여부 |
spring.messages.use-code-as-default-message | false | 메시지를 찾지 못했을 때, 예외 처리 대신 메시지 코드를 그대로 반환 |
아래와 같이 Bean으로도 설정 가능하다.
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
source.setBasenames("classpath:/messages");
source.setDefaultEncoding("UTF-8");
source.setCacheSeconds(60);
source.setUseCodeAsDefaultMessage(true);
source.setDefaultLocale("ko_KR");
return source;
}
ResourceBundleMessageSource이 아닌 ReloadableResourceBundleMessageSource으로 MessageSource를 구현하면, 애플리케이션 실행 중에 메세지 리소스가 변경되어도 변경사항이 적용된다.
국제화에서 언어를 선택하는 기준은 Locale 정보이다. LocaleResolver 인터페이스는 요청을 통한 Locale 확인과 요청 및 응답을 통한 Locale 수정을 모두 수행할 수 있다.
메서드 | 매개변수 | 반환형 | 설명 |
---|---|---|---|
resolveLocale | HttpServletRequest | Locale | 주어진 요청의 현재 Locale을 반환 |
setLocale | HttpServletRequest, HttpServletResponse, Locale | void | 현재 Locale을 설정 |
LocaleResolver 인터페이스는 요청, 세션, 쿠키 등에 기반하여 구현을 허용한다.
AcceptHeaderLocaleResolver
HTTP 요청의 "accept-language" 헤더에 지정된 기본 Locale을 사용한다.
SessionLocaleResolver
로컬로 선택한 Locale 설정을 서블릿 컨테이너의 HttpSession에 저장한다. 이러한 설정은 각 세션에 대해 일시적이며 각 세션이 종료될 때 사라진다.
CookieLocaleResolver
쿠키에 Locale 정보를 저장한다.
이 3가지 중 제일 많이 사용되는 CookieLocaleResolver 클래스는 CookieGenerator 클래스를 상속받기 때문에 다음과 같은 속성을 사용할 수 있다.
속성명 | 기본값 | 설명 |
---|---|---|
cookieName | 클래스명 + Locale | 쿠키명 |
cookieMaxAge | Integer.MAX_INT | 쿠키 유효 시간, (-1 : 브라우저를 닫기 전까지 유효) |
cookiePath | / | 해당하는 Path와 그 하위 Path의 URL에서만 표시됨 |
cookieDomain | 쿠키 도메인, 설정된 도메인 내 서버에서만 표시됨 | |
cookieSecure | false | 쿠키 보안 여부, HTTPS 같은 보안 프로토콜로만 보낼 것인지 여부 |
@Configuration 설정 파일에 다음과 같이 Bean을 추가한다.
@Bean
public LocaleResolver localeResovler() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setCookieName("lang");
localeResolver.setCookieMaxAge(10800);
localeResolver.setCookiePath("/");
localeResolver.setDefaultLocale(new Locale("ko"));
localeResolver.setCookieHttpOnly(true);
}
추가로 LocaleChangeInterceptor 클래스는 요청 url 뒤에 특정 Locale 인자값을 넘겨서 Locale을 변경하도록 해준다.
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}