Java/Spring

[Spring] 09. MessageSource (메시지 국제화)

담크 2021. 6. 24. 17:30

오늘은 MessageSource의 사용법에 대해 정리해보려고 합니다.

바로 패키지 만들러 갑시다~

testmessage_en.properties

member.name=java
member.birthplace=usa
member.hobby=basketball,game
member.age={0}:teenagers
title=[member Information]

testmessage_ko.properties

member.name=\uC790\uBC14
member.birthplace=\uB300\uD55C\uBBFC\uAD6D
member.hobby=\uB18D\uAD6C,\uAC8C\uC784
member.age={0}:\uCCAD\uC18C\uB144
title=[\uD68C\uC6D0\uC815\uBCF4]

여기 부분은 name부터 각각 자바, 대한민국, (농구,게임), 청소년, 회원정보를 적어주세요

그럼 자동으로 저렇게 바뀝니다.

 

MemberInfo.java

package com.test03;

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;

public class MemberInfo implements MessageSourceAware {
	
	private MessageSource message;

	@Override
	public void setMessageSource(MessageSource messageSource) {
		System.out.println("컨테이너가 메세지 설정을 수행중...");
		this.message = messageSource;
	}
	
	public void display(Locale locale) {
		String name = message.getMessage("member.name", null, locale);
		String birthplace = message.getMessage("member.birthplace", null, locale);
		String hobby = message.getMessage("member.hobby", null, locale);
		String age = message.getMessage("member.age", new Object[] {"13"}, locale);
		
		System.out.println(locale);
		System.out.println(name);
		System.out.println(birthplace);
		System.out.println(hobby);
		System.out.println(age);
	}

}

MTest.java

package com.test03;

import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
		
		MemberInfo member = (MemberInfo) factory.getBean("member");
		
		int num = (int)(Math.random()*2);
		
		if (num == 0) {
			String msg = factory.getMessage("title", null, "기본 메세지", Locale.getDefault());
			System.out.println(msg);
			member.display(Locale.getDefault());
		} else {
			String msg = factory.getMessage("title", null, "default message", Locale.ENGLISH);
			System.out.println(msg);
			member.display(Locale.ENGLISH);
		}
	}

}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="com/test03/testmessage" />
	</bean>
	
	<bean id="member" class="com.test03.MemberInfo"/>
</beans>

코드 실행결과 (2개가 랜덤하게 나옵니다.)

 

MessageSource는 ResourceBundleMessageSource와 MessageSourceAware를 꼭 같이 사용해야 한다.

 

applicationContext에서 messageSource의 basename이 testmessage로 되어있는데,

이 말은 ResourceBundleMessageSource가 testmessage_ko.properties, testmessage_en.properties를 가지고 와서 MessageSourceAware에 전달해준다는 뜻이다.

MessageSourceAware는 그 전달받은 파일을 setMessageSource( )로 전달한다.

( => 메시지 국제화를 위해서 사용한다. 영어뿐 아니라 일본어, 프랑스어 ... 등 여러 가지 언어로도 나타낼 수 있다.)

 

이후에는 MTest에서 이 객체를 0일 때 한글, 1일 때 영어로 된 properties를 가져와서 출력시킨다.

 

 

 

 

 

 

 

**만일 저 위에 코드 그대로 작성했는데 한글이 안나오고 영어만 나올 땐 getDefault(컴퓨터 기본설정)가 영어로 되어있는 경우입니다. 설정에서 한글로 바꿔주시면 위 그림처럼 한글과 영어가 랜덤으로 출력됩니다.