본문 바로가기
프로그래밍/스프링프레임워크

Spring Framework 메세지 국제화(다국어 지원) 사용하기

by pentode 2018. 4. 2.

스프링 프레임웍에서 다국어 지원기능을 사용해 보겠습니다. 기본적으로 텍스트로 저장되는 properties 파일을 언어별로 만들어서 사용합니다. 이번에 해볼것은 다음과 같습니다.

 

1. 메세지 프로퍼티 파일을 작성합니다.
2. 스프링프레임웍에서 사용할 수 있도록 설정을 합니다.
3. 언어를 변경할 수 있도록 구현합니다.
4. 자바코드과 jsp 코드에서 다국어 메세지를 사용하는 방법을 알아봅니다.

 

파일구조는 다음과 같습니다.

 

스프링프레임워크 다국어 설정 폴더 구조

 

 

/WEB-INF/messges 폴더 아래에 메세지를 담은 파일이 있습니다. message.properties 파일은 기본 파일 입니다. 언어가 맞지 않으면 이것이 선택되어질 것입니다. message_ko.properties 파일은 한국어 메세지 파일 입니다. message_en.properties 파일은 영어 메세지 파일 입니다. 파일명을 보면 message_언어코드.properties 로 되어 있는것을 볼 수 있습니다. 앞의 message 는 설정파일에서 변경할 수 있습니다.

 

이제 각 파일들의 내용을 알아 봅시다.

 

 

1. 메세지 프로퍼티 파일의 내용입니다. /WEB-INF/messages 폴더에 파일이 존재합니다. 위치는 설정파일에서 변경할 수 있습니다.

 

파일명 : message.properties

site.title=스프링 테스트 사이트
site.count={0} 테스트 사이트 입니다.
msg.first=첫번째

 

파일명 : message_ko.properties

- 파일의 내용은 message.properties 파일과 동일합니다.

 

파일명 : message_en.properites

site.title=Spring test site
site.count=This is {0} test site. 
msg.first=first

 

파일의 내용은 = 로 구분되는 키와 값의 쌍으로 구성되어 있습니다. {0} 처럼 되어 있는 부분은 나중에 다른 값으로 치환될 수 있는 부분을 뜻합니다. {0}, {1}, {2}... 등으로 여러개를 사용할 수 있습니다.

 

 

2. web.xml 파일에서 추가된 스프링 설정파일인 message-context.xml 파일을 로딩하도록 수정합니다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/root-context.xml
		/WEB-INF/spring/message-context.xml
	</param-value>
</context-param>

 

3. message-contex.xml 파일의 내용입니다. 네임스페이스와 스키마 부분은 적지 않았습니다.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
	<property name="basenames">
		<list>
			<!-- 메세지 파일의 위치를 지정합니다. message_언어.properties 파일을 찾습니다. -->
			<value>/WEB-INF/messages/message</value>
		</list>
	</property>

	<!-- 파일의 기본 인코딩을 지정합니다. -->
	<property name="defaultEncoding" value="UTF-8" />

	<!-- properties 파일이 변경되었는지 확인하는 주기를 지정합니다. 60초 간격으로 지정했습니다. -->
	<property name="cacheSeconds" value="60" />
</bean>

<!-- 언어 정보를 세션에 저장하여 사용합니다. -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

여기에서 localeResolver는 브라우저에서 보내는 헤더정보를 사용할 수 도 있고, 쿠키 또는 세션에 저장하여 사용할 수 도 있습니다. 여기서는 세션을 사용합니다.

 

 

4. /WEB-INF/spring/appServlet/servlet-context.xml 파일을 수정하여 언어를 변경하기 위한 인터셉터를 등록합니다.

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

servlet-context.xml 파일의 기본 네임스페이스가 mvc 이므로 바로 <interceptors> 를 사용했습니다. 만약 기본 네임스페이스가 beans 등으로 mvc가 아니라면 <mvc:interceptors> 로 사용되어야 할 것입니다.  이 설정의 의미는 /i18n.do?lang=ko, /i18n.do?lang=en 등으로 요청을 보내면 컨트롤러 앞단에서 요청을 가로채서 언어를 변경하는 역할을 수행합니다.

 

 

5. Java 코드에서 다국어 메세지를 사용하는 방법 입니다. com.tistory.pentode.HomeController.java 파일 입니다.

package com.tistory.pentode;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

	@Autowired
	SessionLocaleResolver localeResolver;

	@Autowired
	MessageSource messageSource;

	@RequestMapping(value = "/i18n.do", method = RequestMethod.GET)
	public String i18n(Locale locale, HttpServletRequest request, Model model) {

		// RequestMapingHandler로 부터 받은 Locale 객체를 출력해 봅니다.
		logger.info("Welcome i18n! The client locale is {}.", locale);

		// localeResolver 로부터 Locale 을 출력해 봅니다.
		logger.info("Session locale is {}.", localeResolver.resolveLocale(request));

		logger.info("site.title : {}", messageSource.getMessage("site.title", null, "default text", locale));
		logger.info("site.count : {}", messageSource.getMessage("site.count", new String[] {"첫번째"}, "default text", locale));
		logger.info("not.exist : {}", messageSource.getMessage("not.exist", null, "default text", locale));
		//logger.info("not.exist 기본값 없음 : {}", messageSource.getMessage("not.exist", null, locale));

		// JSP 페이지에서 EL 을 사용해서 arguments 를 넣을 수 있도록 값을 보낸다.
		model.addAttribute("siteCount", messageSource.getMessage("msg.first", null, locale));

		return "i18n";
	}
}

콘솔 출력 결과 입니다. (언어가 영어로 선택되어 있는 경우)

 

 

 

messageSource의 가장 기본 적인 사용법은 다음과 같습니다.

 

message.getMessage(메세지 키값, 대체할 값이 있을경우 값의 배열, 메세지 기본값, 로케일);

 

메세지 키값에 해당하는 값이 없을 경우 세번째 인자인 메세지 기본값이 출력됩니다.

 

 

6. JSP 에서 사용하는 방법 입니다. /WEB-INF/views/i18n.jsp 파일 입니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title><spring:message code="site.title" text="스프링 테스트 사이트 - default" /></title>
</head>
<body>
	<p>
		<a href="<c:url value="/i18n.do?lang=ko" />">한국어</a>
		<a href="<c:url value="/i18n.do?lang=en" />">English</a>
	</p>
	<p>site.title : <spring:message code="site.title" text="default text" /></p>
	<p>site.count : <spring:message code="site.count" arguments="첫번째" text="default text" /></p>
	<p>site.count using EL : <spring:message code="site.count" arguments="${siteCount}" text="default text" /></p>
	<p>not.exist : <spring:message code="not.exist" text="default text" /></p>
	<%--
	<p>not.exist 기본값 없음 : <spring:message code="not.exist" /></p>
	--%>
</body>
</html>

 

출력 결과 입니다.

 

실행결과 화면

 

 

언어변환에는 *.do?lang=ko, *.do?lang=en 이 사용되었습니다. 메세지 출력을 위해서는 스프링 메세지 태그가 사용되었습니다.

 

태그의 사용법은 <spring:message code="키값" arguments="{0}등에 대체할 값을 콤마로 분리한 문자열" text="키에 해당하는 값이 없을때 대체 문자열" /> 입니다.

 

 

7. 존재하지 않는 키값을 대체 문자열 없이 사용하게 되면 예외가 발생합니다.

 

- jsp 에서 발생하는 예외

javax.servlet.jsp.JspTagException: No message found under code 'not.exist' for locale 'ko'.

 

- java 에서 발생하는 예외

org.springframework.context.NoSuchMessageException: No message found under code 'not.exist' for locale 'ko'.

 

스프링 프레임웍에서 국제화를 사용하는 방법을 알아 봤습니다. 예전에는 한국어 properties 파일을 작성해서 유니코드로 변환하는 과정을 수동으로 했었는데, 전자정부표준프레임워크에는 Properties Editor 플러그인이 포함되어 있어서 변환 과정 없이 message 프로퍼티 파일에서 바로 한글을 사용할 수 있습니다.

 

다른 이클립스를 사용한다면 "Help -> Eclipse Marketplace..." 에서 Properties Editor 로 검색해서 설치하면 되겠습니다.

 

반응형