본문 바로가기
[개발] 프레임워크/Spring

Spring으로 다국어 페이지 만들기

by Devsong26 2018. 4. 22.

회사 홈페이지를 다국어로 퍼블리싱을 해야 한다는 이야기를 듣고 나서 Spring을 이용한 다국어 페이지 만드는 방법을 여러가지 검색을 해보면서 구현을 해봤다. 

 

는 메세지 번들까지는 사용하지 않았다. 새로운 것을 적용하는데 오래 걸릴 것 같다는 불안감 때문에 JSTL로 분기를 나눠 JSP에서 화면상에 언어를 다르게 표현만 해주는 것으로 그쳤다. 거기까지만 했지만 알게 된 정보들이 있어 공유하려고 한다.

 

 

1. Locale을 이용해야 한다. 

 

Locale은 사용자의 언어, 국가 뿐 아니라 사용자 인터페이스에서 사용자가 선호하는 사항을 저장하는 매개 변수의 모임이다. 

 

출처: https://ko.wikipedia.org/wiki/%EB%A1%9C%EC%BC%80%EC%9D%BC

 

- Locale을 이용해서 서버에 접속하는 클라이언트에 언어를 알아낸다.

- 클라이언트에서 뽑아낸 언어를 이용하여 분기문을 거친 후 해당하는 언어권 응답 페이지를 반환하다. 

 

이 때, 중요한 것이 클라이언트에서 보내는 request-header 안에 있는 accept-language이다. 

 

 

* accept-language란?

 

어떤 언어를 클라이언트가 이해할 수 있는지, 그리고 지역 설정 중 어떤 것이 더 선호되는지를 알려줍니다. (여기서 언어란 프로그래밍 언어가 아니라 영어같은 자연 언어를 의미합니다.) 컨텐츠 협상을 사용하여, 서버는 제안 중 하나를 선택한 뒤, 그 것을 사용하고 Content-Language 응답 헤더와 함께 선택된 내용을 클라이언트에게 알려줍니다. 브라우저는 사용자 인터페이스 언어에 따라 해당 헤더에 적절한 값을 설정하며 사용자가 사용자 인터페이스 언어를 변경한 경우조차도, 헤더의 값이 변경되는 일은 거의 없습니다.

 

이 헤더는 서버가 언어를 결정할 다른 방도(명시적인 사용자 결정에 의한 구체적인 URL과 같은)를 찾지 못한 경우 사용되는 힌트입니다. 서버는 명시적인 결정을 결코 재 정의해서는 안됩니다. Accept-Language의 내용은 대게 사용자에 의해 조작되지  못 합니다.(다른 나라의 인터넷 카페를 방문하여 사용하는 경우처럼);  사용자는 그들의 사용자 인터페이스의 로케일과는 다른 언어로 된 페이지에 방문하고 싶어할 수도 있습니다. 

 

서버가 일치되는 어떤 언어로 서브할 수 없는 경우, 이론적으로 406 (Not Acceptable) 오류 코드를 회신하게 됩니다. 그러나, 좀 더 나은 사용자 경험을 위해, 이런 경우는 드물며 그런 경우에 가장 흔한 방법은 Accept-Language 헤더를 무시하는 것입니다. 

 

출처: https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Accept-Language

 

accept-language의 default값은 시스템 언어 설정을 가지고 온다.

 

위의 설명에서는 Header값이 변경되지 않는다고 하지만 여러 브라우저에서 request-header의 accept-language를 변경할 수 있는 것 같다. 

 

나의 경우에는 주로 사용하는 브라우저가 크롬이기 때문에 크롬에서 accept-header의 정보를 변경해보았다. 

 

 

* 크롬에서 accept-language 변경하는 방법

 

설정 -> 고급 -> 언어 탭을 클릭한다. 

 

언어 추가를 눌러 추가할 언어를 선택한다. 

 

추가한 다음에 우측 끝에 옵션키를 클릭하여 "이 언어로 Chrome 표시"를 누른 후 기존에 있던 언어는 모두 삭제한다. 

 

나는 영어를 추가하고 영어를 선택한 다음, 한국어를 지우고 영어버전으로 다시시작을 눌렀다.

 

그 후 개발자 도구 network탭을 눌러 request-header의 accept-language를 확인해 보면 accept-language가 변화된 것을 확인할 수 있다.

 

 

변경된 accept-language 값을 이용하면 요청한 언어에 맞게 내가 작성한 다국어 페이지를 응답시킬 수 있다. 

 

이제 서버 설정을 해보자. 

 

 

 

2. Spring 프로젝트에서 설정하기

servlet-context.xml에 multipartResolver, LocaleResolver, LocaleChangeInterceptor 클래스의 빈을 등록한다.

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.commonsMultipartResolver"/>
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>

<mvc:interceptors>
  <beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.localeChangeInterceptor">
  	<beans:property name="paramName" value="lang" />
  </beans:bean>
</mvc:interceptors>

 

 

(참고 블로그: http://yookeun.github.io/java/2015/08/12/spring-i18n/)

 

SessionLocaleResolver의 경우 bean 등록시 defaultLocale을 property로 줄 수 있는데 defaultLocale을 property로 주지 않을 경우, request-header의 Accept-Language의 언어를 참고하여 Controller에서 올바른 언어권의 응답 페이지를 클라이언트에게 전송할 수 있다. 

 

@RequestMapping(value="/", method=RequestMethod.GET)
public String home(Locale locale, Model model){
  logger.info("Welcome home! The client locale is {}.", locale);

  String lang = locale.getLanguage().toUpperCase();
  String url;

  if(lang.equals("KO")){ //한국
    lang = "ko";
    url = "main";
  }else{ //영어권
    lang = "en";
    url = "foreign/en/main";
  }

  model.addAttribute("lang", lang);
  return url;
}

 

 

HomeController에 root로 접근시 호출되는 메소드를 정의했다. 

위의 메소드를 호출해서 gnb를 구현할 때는 

 

localhost:포트번호/프로젝트명/?lang=en : 영어

localhost:포트번호/프로젝트명/?lang=ko : 한국

 

페이지를 응답으로 클라이언트에게 전달하면 되며, 위의 url로 접근할 경우, response-header의 content-language의 값이 변경되며 이 값이 유지되어 해당 언어권의 페이지를 응답받는다. 

 

 

 

 

 


더 많은 내용을 보시려면 아래를 참고하세요.


블로그의 다른 글

 

Spring Lombok

이번에 새롭게 투입된 프로젝트에서는 lombok이라는 라이브러리를 사용하고 있다. 처음에는 이것의 존재를 모르고 있었는데, Github에서 프로젝트를 Cloning하고 Maven 업데이트를 했는데 프로젝트에

developer-syubrofo.tistory.com

 

[Java] Service, Controller 테스트

Junit으로 TDD를 실천하면서 어떻게 코드를 테스트 해야하는지 감이 잡혀온다. 알게 된 점은 아래와 같다. 1. 테스트 코드 작성법 2. 고민되는 부분 3. MockMvc의 사용법 4. Assert 사용법 1. 테스트 코드

developer-syubrofo.tistory.com

 

How to use(insert) spatial data in mysql and JPA.

Introduction I introduce how to use spatial type columns in MySQL and JPA. Subject I introduce how to use spatial type columns in MySQL and JPA. MySQL has spatial data types that correspond to OpenG..

developer-syubrofo.tistory.com

 

The unknown errors occur in pom.xml when using STS4

Introduction I start I made the new spring starter project in sts4. But I checked the unknown error in pom.xml. Subject Why do these errors occur? When the spring framework builds a..

developer-syubrofo.tistory.com

 

How do I set up the OS system variables in Spring Boot Application Properties?

Introduction Recently, I have a job to use a public repository. But I don't want to make public my configuration information. At last, I found a way to meet my requirements and int..

developer-syubrofo.tistory.com