본문 바로가기
Programming/Spring

[Spring boot] Spring boot에서 다국어 지원하기 (1)

by SpiralMoon 2019. 4. 2.
반응형

 주제 : Spring boot에서 다국어 지원하기 (1).

 

Spring boot에서 클라이언트의 언어&국가정보를 인식하는 방법과 언어&국가정보가 없을 경우에 대해 대처하는 방법을 알아보자.

 

▶  관련 문서

▷ Spring boot에서 다국어 지원하기 (2)

 

[Spring boot] Spring boot에서 다국어 지원하기 (2)

▶ 주제 : Spring boot에서 다국어 지원하기 (2). 클라이언트의 언어&국가정보를 바탕으로 각기 다른 언어 리소스를 호출하는 방법을 알아보자. ▶ 관련 문서 ▷ Spring boot에서 다국어 지원하기 (1) [Spring boo..

spiralmoon.tistory.com

ISO 639-1

 

List of ISO 639-1 codes - Wikipedia

Wikimedia list article ISO 639 is a standardized nomenclature used to classify languages. Each language is assigned a two-letter (639-1) and three-letter (639-2 and 639-3), lowercase abbreviation, amended in later versions of the nomenclature. This table l

en.wikipedia.org

ISO 3166-1

 

ISO 3166-1 - Wikipedia

ISO 3166-1 is part of the ISO 3166 standard published by the International Organization for Standardization (ISO), and defines codes for the names of countries, dependent territories, and special areas of geographical interest. The official name of the sta

en.wikipedia.org

 

▶  작성 환경

Spring boot 2.0

 

▶  방법

 

Spring에서는 클라이언트가 서버로 request를 했을 때 Locale이라는 객체를 통하여 클라이언트의 언어&국가정보를 식별할 수 있다.

 

이용할 클래스 목록은 다음과 같다.

첫 번째, LocaleResolver. 클라이언트의 언어&국가정보를 인식하는 클래스.

두 번째, Locale. 클라이언트의 언어&국가정보를 표현할 클래스.

 

▶  LocaleResolver

 

LocaleResolver는 클라이언트의 언어&국가정보를 인식할 클래스로, 우선 Bean 등록을 해주어야 한다.

 

종류는 다음과 같다.

AcceptHeaderLocaleResolver : http 통신 때 사용되는 Accept-Language 필드를 이용하여 언어&국가정보를 인식. (Spring 기본 LocaleResolver)

CookieLocaleResolver : 쿠키를 이용해 언어&국가정보를 인식.

SessionLocaleResolver : 세션을 이용해 언어&국가정보를 인식.

FixedLocaleResolver : 모든 요청에 대해 특정한 언어&국가정보로 인식.

 

이번 예시에서는 AcceptHeaderLocaleResolver를 이용할 것이다.

 

@Configuration
@EnableWebMvc
public class WebConfig {

    @Bean
    public LocaleResolver localeResolver() {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        // 언어&국가정보가 없는 경우 미국으로 인식하도록 설정
        localeResolver.setDefaultLocale(Locale.US);
        return localeResolver;
    }
}

LocaleResolver를 Bean으로 등록한다. 여러 종류의 LocaleResolver 클래스 중에서 원하는 것을 등록해주면 된다.

 

나는 AcceptHeaderLocaleResolver를 적용했는데 이것을 사용하면 서버로 들어온 http 통신의 Accept-Language 필드 값을 읽어들여 언어&국가정보를 인식하게 된다.

 

Accept-Language 필드는 언어코드-국가코드 형태로 들어있어야 한다. 언어코드는 ISO 639-1 alpha-2, 국가코드는 ISO 3166-1 alpha-2 표준을 맞춰주어야한다.

 

언어가 한국어, 국가가 대한민국이면 Accept-Language : ko-KR

언어가 영어, 국가가 미국이면 Accept-Language : en-US

언어가 중국어, 국가가 대만이면 Accept-Language : zh-TW

 

그리고 반드시 언어&국가정보가 없을 경우에 대한 기본값 설정을 권장한다. 이유는 다음과 같다.

이 소스코드는 AcceptHeaderLocaleResolver.java의 실제 구현 소스인데 주석을 번역하자면,

"클라이언트가 요청한 request의 header에 Accept-Language가 없을 경우 미리 설정한 defaultLocale을 지정하도록 한다. defaultLocale을 지정하지 않은 경우엔 서버가 작동하고 있는 컴퓨터 환경의 언어&국가정보를 따르게 된다."

라고 쓰여있다.

무슨 뜻이냐면, 내가 한국에서 다국어 기능이 들어간 서버를 배포했는데 클라이언트가 따로 요구한 언어&국가정보가 없을 경우에는 내 시스템이 한국으로 설정되기 때문에 한국어로 지원을 하게 된다는 뜻이다. 그러니 가급적이면 기본값을 영어로 설정해두도록 하자.

 

 

▶  Locale

 

Locale은 언어&국가정보를 표현하는 클래스로, LocaleResolver를 Bean으로 등록하였다면 Controller 클래스에서 Locale을 인식하여 사용할 수 있다.

 

@Controller
public class testController {

    @RequestMapping(value = "test", method = RequestMethod.GET)
    // Header가 파싱되어 locale을 자동으로 받아옴
    public void test (Locale locale) {
        ...
    }
}

Accept-Language의 포맷과 내용이 살짝 다른데 지역이 대한민국일 때 Accept-Language가 ko-KR이었다면, Locale이 인식한 정보는 ko_KR로 가지고 있게 된다.

 

 

 

 

 

반응형

'Programming > Spring' 카테고리의 다른 글

[Spring boot] Spring boot에서 다국어 지원하기 (2)  (0) 2019.04.08

댓글