스프링 강의 내용을 적용해보기 위해 간단한 투두리스트를 만들어보고 있다. 이번에는 메시지, 국제화에 대해 배웠기 때문에 다국어 기능을 추가해보기로 했다.
애플리케이션이 언어 정보, 즉 로케일 정보를 어디서 관리할 것인지는 여러 방식으로 선택할 수 있다. 다국어 기능을 위해서 세션이나 쿠키를 많이 사용하는 것 같은데, 아직 쿠키 강의는 아직 듣지 않았기 때문에 세션 방식을 해 보기로 했다.
@Configuration
public class LocaleConfig {
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(new Locale("ko"));
return sessionLocaleResolver;
}
LocaleConfig
컨트롤러를 만들고 SessionLocaleResolver
빈을 추가해주었다.setDefaultLocale()
을 통해 기본 로케일을 설정해준다.@Slf4j
@Controller
public class configController {
@GetMapping("/lang")
public String changeLocale(@RequestParam("lang") String language, HttpSession session) {
session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale(language));
log.info("Locale={}", session.getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME)); //확인용 로깅
return "redirect:/tasks";
}
}
MessageSource
의 getMessage()
에서도 Thymeleaf 템플릿에서도 모두 잘 출력되었다.<li><a href="/international?lang=ko">한국어</a></li>
<li><a href="/international?lang=en">English</a></li>
WebMvcConfigurer
인터페이스의 LocaleChangeInterceptor
를 사용하면 로케일을 처리하는 컨트롤러 코드 없이 더 간단하게 로케일을 변경할 수 있다.
WebMvcConfigurer
는 스프링 MVC의 기본 설정을 변경하거나 추가를 돕는 인터페이스이다.LocaleChangeInterceptor
는 요청이 컨트롤러에 도달하기 전에 데이터를 가로채서 로케일을 변경해주는 것이다.@Configuration
public class LocaleConfig implements WebMvcConfigurer {
@Bean
public SessionLocaleResolver localeResolver() {...}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
LocaleConfig
가 WebMvcConfigurer
인터페이스를 구현하도록(implements) 한다.LocaleChangeInterceptor
빈을 추가해준다.ParameterName
의 기본값은 “locale”이다.setParameterName()
을 통해 “lang”으로 변경해주었다. (기본값 그대로 써도 상관없다.)addInterceptors()
: Interceptor를 InterceptorRegistry
에 추가해준다. (스프링 인터셉트를 사용하기 위해서는 레지스트리에 추가해야 한다. addInterceptor()
메서드는 인터페이스에서 상속받아 사용하는 것이므로 @Override
애노테이션을 달아준다.)@Controller
public class configController {
@GetMapping("/international")
public String changeLocale() {
return "redirect:/tasks";
}
}
session.setAttribute()
와 같은 처리는 필요없다. 컨트롤러는 리다이렉팅만 하고 “lang” 파라미터를 받아서 세션 레벨에서 로케일을 변경하는 작업은 Interceptor가 알아서 해준다.