[09] 국제화

MIIIN·2021년 11월 30일
0

Spring Boot

목록 보기
9/9
post-thumbnail

✈️ Internationalization

Spring Boot는 메시지 로컬화를 지원해서 애플리케이션을 서로 다른 언어 선호를 가진 유저들에게 맞춰 줄 수 있다. 기본적으로 Spring Boot는 classpath의 root에서 메시지 리소스 번들이 있는지 찾는다.

자동 구성은 구성된 리소스 번들의 기본 properties 파일(예:messages.properties)이 사용가능할 때 적용된다. 리소스 번들에 언어별 속성 파일만 포함되어 있으면 기본값을 추가해야 한다. 구성된 기본 이름과 일치하는 속성 파일이 없으면 자동으로 구성된 메시지 소스가 없다.

spring.messages.basename=messages,config.i18n.messages
spring.messages.fallback-to-system-locale=false

🍈 MessageSourceProperties

아래와 같은 message 속성을 지정할 수 있다.

속성기본값설명
spring.messages.basenamemessagesmessage 파일 이름 설정. comma로 구분하여 여러 이름을 설정가능
spring.messages.encodingUTF-8인코딩 방식
spring.messages.cache-duration캐시 주기 설정, 기본값 forever
spring.messages.fallback-to-system-localetrue감지된 파일이 없는 경우 (true) system locale 사용, (false) messages.properties 파일 사용
spring.messages.always-use-message-formatfalseMessageFormat을 전체 메시지에 적용할 것인지 여부
spring.messages.use-code-as-default-messagefalse메시지를 찾지 못했을 때, 예외 처리 대신 메시지 코드를 그대로 반환

아래와 같이 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를 구현하면, 애플리케이션 실행 중에 메세지 리소스가 변경되어도 변경사항이 적용된다.


🍈 LocaleResolver

국제화에서 언어를 선택하는 기준은 Locale 정보이다. LocaleResolver 인터페이스는 요청을 통한 Locale 확인과 요청 및 응답을 통한 Locale 수정을 모두 수행할 수 있다.

메서드매개변수반환형설명
resolveLocaleHttpServletRequestLocale주어진 요청의 현재 Locale을 반환
setLocaleHttpServletRequest, HttpServletResponse, Localevoid현재 Locale을 설정

LocaleResolver 인터페이스는 요청, 세션, 쿠키 등에 기반하여 구현을 허용한다.

  1. AcceptHeaderLocaleResolver
    HTTP 요청의 "accept-language" 헤더에 지정된 기본 Locale을 사용한다.

  2. SessionLocaleResolver
    로컬로 선택한 Locale 설정을 서블릿 컨테이너의 HttpSession에 저장한다. 이러한 설정은 각 세션에 대해 일시적이며 각 세션이 종료될 때 사라진다.

  3. CookieLocaleResolver
    쿠키에 Locale 정보를 저장한다.

이 3가지 중 제일 많이 사용되는 CookieLocaleResolver 클래스는 CookieGenerator 클래스를 상속받기 때문에 다음과 같은 속성을 사용할 수 있다.

속성명기본값설명
cookieName클래스명 + Locale쿠키명
cookieMaxAgeInteger.MAX_INT쿠키 유효 시간, (-1 : 브라우저를 닫기 전까지 유효)
cookiePath/해당하는 Path와 그 하위 Path의 URL에서만 표시됨
cookieDomain쿠키 도메인, 설정된 도메인 내 서버에서만 표시됨
cookieSecurefalse쿠키 보안 여부, 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;
}

🐬 계속해서 데이터 개방 표준 포맷인 JSON에 대해 알아보자~

profile
백엔드개발자

0개의 댓글