1. 들어가며
회사에서 다국어 처리 기능을 구현했습니다.
회사에서 사용한 `스프링 레거시 + JSP`를 그대로 정리할까 하다가 스프링 부트는 어떻게 다른지 궁금해서 `스프링 부트 + thymeleaf` 로 다국어 처리 하는 방법을 정리하며 간단한 기능을 구현해 보겠습니다.

2. LocaleConfig.java
package greathyeon.com.springstudy.config;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import java.util.Locale;
@Configuration
public class LocaleConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setDefaultLocale(Locale.KOREAN); // 기본 로케일을 한국어로 설정
localeResolver.setCookieName("lang"); // 쿠키 이름 설정
localeResolver.setCookieMaxAge(86400); // 1일(24시간) 유지
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 요청 파라미터 이름 설정 (예: `?lang=en`)
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
2-1 implements WebMvcConfigurer
인터셉터 추가(addInterceptors), 뷰 리졸버 설정(LocaleResolver)등을 가능하게 해주는 `WebMvcConfigurer`를 구현해 줍니다.
2-2 localeResolver()
CookieLocaleResolver localeResolver = new CookieLocaleResolver() :
Spring의 다국어(i18n) 지원을 위해 LocaleResolver 인터페이스를 구현합니다.
쿠키 설정
localeResolver.setDefaultLocale(Locale.KOREAN) : 기본 로케일을 한국어로 설정합니다.
localeResolver.setCookieName("lang") : 쿠키 이름을 lang으로 설정합니다.
localeResolver.setCookieMaxAge(86400); 쿠키 유지 시간을 초단위로 설정합니다. 86400은 1일입니다.
2-3 localeChangeInterceptor()
사용자가 ? lang=en 같은 쿼리 파라미터를 입력하면 `LocaleChangeInterceptor`가 해당 값을 감지해 자동으로 로케일(언어)이 변경되며, `CookieLocalResolver`를 통해 쿠키를 생성합니다.
2-4 addInterceptor()
`localeChangeInterceptor()`에서 만든 인터셉터를 Spring MVC에 등록합니다.
2-5 messageSource()
setBasename("classpath:messages") : resources 폴더 안에서 messages 파일을 찾도록 설정해 줍니다.

설정 후에 resources 폴더 안에 messages_en.properties , messages_ko.properties 파일을 생성해 주면 알아서 Resource Bundle 'messages'로 묶어줍니다.
setDefaultEncoding("UTF-8") : 한글이 깨지지 않도록 UTF-8 인코딩을 설정해 줍니다.
3. messages_*. properties
# 파일명 : messages_ko.properties
example = 이것은 한글입니다.
한글의 경우 파일 인코딩이 `UTF-8`이 맞는지 확인하셔야 합니다.
인코딩이 다를 경우 한글을 읽지 못해 ??? ?????.로 출력됩니다.
LocaleConfig에서 UTF-8로 setDefaultEncoding해주었지만 파일자체가 다른 인코딩이라면 소용이 없었습니다.
인텔리제이 사용자는 Settings를 열고 `File Encodings`에 들어가 `Default encoding for properties files`를 `UTF-8`로 바꿔주시기 바랍니다.

# 파일명 : messages_en.properties
example = This is English.
4. internationalization.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>다국어 연습</title>
</head>
<script>
function toggleLanguage() {
let currentLang = new URLSearchParams(window.location.search).get("lang") || "ko";
let newLang = (currentLang === "ko") ? "en" : "ko";
// 쿠키에 언어 값 저장
document.cookie = "lang=" + newLang + "; path=/; max-age=86400";
// 페이지 새로고침하여 적용
window.location.href = "?lang=" + newLang;
}
</script>
<body>
<button id="lang-toggle-btn" onclick="toggleLanguage()" th:text="${#locale.language == 'ko' ? 'English' : '한국어'}">English</button>
<p th:text="#{example}"></p>
</body>
</html>
간단하게 토글버튼을 만들어 구현해 봤습니다.
Thymeleaf에서는 아래의 코드를 작성해 주시면 됩니다.
<p th:text="#{example}"></p>
#{}안에 example를 messages_(lang).properties 파일에서 찾아서 출력해 줍니다.
lang쿠키의 값이 ko라면 messages_ko.properties의 example을,
lang쿠키의 값이 en이라면 messages_en.properties의 example을 찾아서 출력합니다.
이렇게 스프링 부트 다국어 처리법이 완료되었습니다.
'Spring' 카테고리의 다른 글
[Spring Boot] thymeleaf 에러 : org.thymeleaf.exceptions.TemplateInputException (0) | 2024.05.05 |
---|
1. 들어가며
회사에서 다국어 처리 기능을 구현했습니다.
회사에서 사용한 스프링 레거시 + JSP
를 그대로 정리할까 하다가 스프링 부트는 어떻게 다른지 궁금해서 스프링 부트 + thymeleaf
로 다국어 처리 하는 방법을 정리하며 간단한 기능을 구현해 보겠습니다.

2. LocaleConfig.java
package greathyeon.com.springstudy.config;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import java.util.Locale;
@Configuration
public class LocaleConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setDefaultLocale(Locale.KOREAN); // 기본 로케일을 한국어로 설정
localeResolver.setCookieName("lang"); // 쿠키 이름 설정
localeResolver.setCookieMaxAge(86400); // 1일(24시간) 유지
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 요청 파라미터 이름 설정 (예: `?lang=en`)
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
2-1 implements WebMvcConfigurer
인터셉터 추가(addInterceptors), 뷰 리졸버 설정(LocaleResolver)등을 가능하게 해주는 WebMvcConfigurer
를 구현해 줍니다.
2-2 localeResolver()
CookieLocaleResolver localeResolver = new CookieLocaleResolver() :
Spring의 다국어(i18n) 지원을 위해 LocaleResolver 인터페이스를 구현합니다.
쿠키 설정
localeResolver.setDefaultLocale(Locale.KOREAN) : 기본 로케일을 한국어로 설정합니다.
localeResolver.setCookieName("lang") : 쿠키 이름을 lang으로 설정합니다.
localeResolver.setCookieMaxAge(86400); 쿠키 유지 시간을 초단위로 설정합니다. 86400은 1일입니다.
2-3 localeChangeInterceptor()
사용자가 ? lang=en 같은 쿼리 파라미터를 입력하면 LocaleChangeInterceptor
가 해당 값을 감지해 자동으로 로케일(언어)이 변경되며, CookieLocalResolver
를 통해 쿠키를 생성합니다.
2-4 addInterceptor()
localeChangeInterceptor()
에서 만든 인터셉터를 Spring MVC에 등록합니다.
2-5 messageSource()
setBasename("classpath:messages") : resources 폴더 안에서 messages 파일을 찾도록 설정해 줍니다.

설정 후에 resources 폴더 안에 messages_en.properties , messages_ko.properties 파일을 생성해 주면 알아서 Resource Bundle 'messages'로 묶어줍니다.
setDefaultEncoding("UTF-8") : 한글이 깨지지 않도록 UTF-8 인코딩을 설정해 줍니다.
3. messages_*. properties
# 파일명 : messages_ko.properties
example = 이것은 한글입니다.
한글의 경우 파일 인코딩이 UTF-8
이 맞는지 확인하셔야 합니다.
인코딩이 다를 경우 한글을 읽지 못해 ??? ?????.로 출력됩니다.
LocaleConfig에서 UTF-8로 setDefaultEncoding해주었지만 파일자체가 다른 인코딩이라면 소용이 없었습니다.
인텔리제이 사용자는 Settings를 열고 File Encodings
에 들어가 Default encoding for properties files
를 UTF-8
로 바꿔주시기 바랍니다.

# 파일명 : messages_en.properties
example = This is English.
4. internationalization.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>다국어 연습</title>
</head>
<script>
function toggleLanguage() {
let currentLang = new URLSearchParams(window.location.search).get("lang") || "ko";
let newLang = (currentLang === "ko") ? "en" : "ko";
// 쿠키에 언어 값 저장
document.cookie = "lang=" + newLang + "; path=/; max-age=86400";
// 페이지 새로고침하여 적용
window.location.href = "?lang=" + newLang;
}
</script>
<body>
<button id="lang-toggle-btn" onclick="toggleLanguage()" th:text="${#locale.language == 'ko' ? 'English' : '한국어'}">English</button>
<p th:text="#{example}"></p>
</body>
</html>
간단하게 토글버튼을 만들어 구현해 봤습니다.
Thymeleaf에서는 아래의 코드를 작성해 주시면 됩니다.
<p th:text="#{example}"></p>
#{}안에 example를 messages_(lang).properties 파일에서 찾아서 출력해 줍니다.
lang쿠키의 값이 ko라면 messages_ko.properties의 example을,
lang쿠키의 값이 en이라면 messages_en.properties의 example을 찾아서 출력합니다.
이렇게 스프링 부트 다국어 처리법이 완료되었습니다.
'Spring' 카테고리의 다른 글
[Spring Boot] thymeleaf 에러 : org.thymeleaf.exceptions.TemplateInputException (0) | 2024.05.05 |
---|