안녕하세요.
오늘은 Spring Boot에서 다국어를 사용하는 방법을 설명하겠습니다.
Spring boot에 WebMvcConfigurer 를 상속받아서 설정을 하시면 됩니다.
프로젝트를 생성하고 config 클래스 만들어 줍니다.
기존에 사용하고 있는 프로젝트라면 WebMvcConfigurer 상속받은 클래스에 추가적으로 해당 내용들을 넣어주시면 됩니다.
이렇게 설정을 하면 API 호출시 헤더에 Accept-Language 값으로 언어를 구분할 수 있습니다.
추가적인 언어를 추가하기 위해서 CustomLocaleResolver에 en, ko 부분을 추가적으로 넣어주시면 됩니다.
예제로 만든 부분이여서 해당 데이터는 하드코딩으로 작업되었습니다.
STEP1 다국어 설정 클래스 작성
import lombok.extern.log4j.Log4j2;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
@Log4j2
@Configuration
@PropertySource("classpath:application.yml")
@ComponentScan("server")
public class ServletConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
CustomLocaleResolver customLocaleResolver = new CustomLocaleResolver();
customLocaleResolver.setDefaultLocale(Locale.KOREA);
return customLocaleResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(60);
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
@Bean(name = "messageSourceAccessor")
public MessageSourceAccessor messageSourceAccessor(MessageSource messageSource) {
return new MessageSourceAccessor(messageSource, Locale.getDefault());
}
public static class CustomLocaleResolver extends AcceptHeaderLocaleResolver {
String[] mLanguageCode = new String[]{"ko", "en"};
List<Locale> mLocales = Arrays.asList(new Locale("en"), new Locale("es"), new Locale("ko"));
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 언어팩 변경
String acceptLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
if (acceptLanguage == null || "".equals(acceptLanguage)) {
return Locale.getDefault();
}
List<Locale.LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));
mLocales = new ArrayList<>();
for (String code : mLanguageCode) {
mLocales.add(new Locale(code));
}
return Locale.lookup(list, mLocales);
}
}
}
STEP2 국가별 언어 작성
프로젝트 resources 아래의 국가별 properties를 작성해 줍니다.
한국어
messages_ko.properties
영어
messages_en.properties
ko, en 은 위에서 설정한 en, ko입니다.
파일을 만들고 나서 properties에 내용을 작성합니다.
messages_ko.properties
RESULT_MSG_SUCCESS=성공
messages_en.properties
RESULT_MSG_SUCCESS=SUCCESS
RESULT_MSG_SUCCESS는 JAVA에서 사용될 KEY 값입니다.
메시지 내용은 각 언어에 맞게 작성해주시면 됩니다.
RESULT_MSG_SUCCESS는 편하게 만들어주시면 됩니다.
이렇게 메시지들을 키-벨류로 모아서
가지고 있습니다.
STEP3 messageUtils 만들기
사용하기 편하게 유틸클래스를 만들어 줍니다.
@Comppnet를 넣어 만들어서
@Autowired를 사용이 가능합니다.
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
/**
* 메시지 정보를 전달하는 유틸
* 메시지는 코드로 구분 (다국어)
*/
@Component
public class MessageUtils {
private MessageSource messageSource;
public MessageUtils(MessageSource messageSource) {
this.messageSource = messageSource;
}
/**
* 언어팩 언어 가져오기
*
* @param code 언어팩 코드
* @return String
*/
public String getMessage(String code) {
return messageSource.getMessage(code, null, LocaleContextHolder.getLocale());
}
/**
* 언어팩 언어 가져오기
*
* @param code 언어팩 코드
* @param strs 동적 문자
* @return String
*/
public String getMessage(String code, String[] strs) {
return messageSource.getMessage(code, strs, LocaleContextHolder.getLocale());
}
}
STEP4 사용하기
Controller를 만들고 MessageUtils를 사용해서 아까 만든 키값을 넣어주면 끝입니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import server.application.utils.MessageUtils;
/**
* 맴버 관련 컨트롤러
*/
@RestController
public class MemberController {
@Autowired
MessageUtils messageUtils;
@RequestMapping(method = RequestMethod.POST, path = "/api/v1/member")
public @ResponseBody
String join() {
return messageUtils.getMessage("RESULT_MSG_SUCCESS");
}
}
postman을 통해 방금 만든 API를 테스트해 보겠습니다.
언어설정 후 사용하면 됩니다.
기본 언어는 한국어 입니다.
Accept-Language를 ko로 하면 성공이라는 글자가 나오고
Accept-Language를 en으로 하면 SUCCESS글자가 나오는걸 확인할 수 있습니다.
해당 게시글은 가단한 사용법만 제공한다는 점 알아두시면 좋겠습니다.
실제로 사용자에 따라 커스텀 또는 사용방법이 다를 수 있습니다.
기본적인 구조만 파악하시고 각자 프로젝트 및 본인 스타일에 맞게 사용하시면 될 듯합니다.
감사합니다.
'dev > Spring Boot' 카테고리의 다른 글
JEUS JNI Native Library so 파일 적용기 (112) | 2024.05.16 |
---|---|
Spring Boot JPA 기초 및 셋팅 (1) | 2023.07.22 |
[오라클]Oracle DB XE 무료버전 설치 및 설치 오류 방법 (2) | 2022.12.06 |
Spring Boot MyBatis 로 MySql 연동하기 Gradle (5) | 2021.08.07 |