♣ Tech & Biz Salon/Tech

Spring 3.0 Message 처리 (ReloadableResourceBundleMessageSource, MessageSourceAccessor )

TasteGod 2013. 7. 11. 11:10

바쁜 와중이지만 정리하고 넘어간다. 
바로 바로 정리안하면 나중에 한다고 해놓고 결국은 안하는 경우가 대부분이다. 

업무하다가 정리 필요성을 느끼는것은 바로 정리하는것이 현명한 방법이다.
업무 정리를 나중에 해선 안된다. 업무 정리는 일단 해놓은 다음...
나중에 뭘 한다면...  정리한것을 다시 복습하거나 깊이 파고들거나 .. 공부하는것에 사용하면 된다.

하는김에... 일단... 작년에 SPRING 3.0 쓰면서 사용했던 방법부터 얘기해본다.

< Spring Util 의 Properties 를 이용 >


XML

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>

    <entry key="hwp_upload_path">D:/JE/workspace/psst/src/main/webapp/uploadIncoming/hwp/</entry>

    ......

</properties>


CONTEXT XML

<util:properties id="urlPath" location="/WEB-INF/config/properties/prop_url_path.xml"/>


JAVA

import java.util.Properties;

Properties propFile;


@Autowired

@Qualifier("file")

public void setPropFile(Properties props) {

propFile = props;

}


String strUploadPath = propFile.getProperty("hwp_upload_path");

사실 이 방법을 썼다가 귀차니즘을 자극해서... 빼버리고, 어차피 다국어처리도 안하므로 ResouceBundle 쓰지도 않고.. 아주 예전에 썼던 방식으로 썼었는데

다른 개발자가 좋은게 있다고 해서 적용한다길래 알아서하라고 하고 나중에 봤더니 
내가 했던거를 다시 해놓았었음.


자 그럼... 오늘 해본거를 적어보자.  결론적으로... 프라퍼티가 Refresh 되므로 Very Good 이다. 물론 서버재기동이 적용된다고 보면 될 거 같고 ( 테스트는 안했음 )

< Spring의 ReloadableResourceBundleMessageSource, 

MessageSourceAccessor 이용 >


server.properties

server.middle.site=middle
server.primary.site=primary
server.file.domain=farm.resources.ebs.co.kr

Context XML

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

<property name="basenames">

<list>

<value>classpath:properties/server</value>

<value>classpath:properties/exception</value>

</list>

</property>

<property name="cacheSeconds">

        <value>60</value>

    </property>

</bean>


<bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">

<constructor-arg>

<ref local="messageSource" />

</constructor-arg>

</bean>

JAVA

// both works -- 참조 선언

// 1)

@Autowired
private MessageSourceAccessor messageSourceAccessor;

// 2)

// @Resource(name="messageSourceAccessor")
// private MessageSourceAccessor accessor;

// both works -- 값 얻기

// 1)

String resourceHost = messageSourceAccessor.getMessage("server.file.domain", "");
logger.debug("resourceHost:" + resourceHost );

// 2)

// String resourceHost2 = accessor.getMessage("server.file.domain", "");
// logger.debug("resourceHost2:" + resourceHost2 );

JSTL

1) JAVA에서 model attribute 에서 할당해서 써도 되는건 당연하고
2) 직접
<spring:message code='server.file.domain' var="imageServerPath"/>
${imageServerPath}


* 난 로케일은 안썼는데 사용할 경우 아래처럼 가능할 것이다. 

 ( 참고 : http://blog.naver.com/pureb612b/10120505318 )

Locale locale=request.getLocale();

accessor.getMessage("키", locale);

accessor.getMessage("키", Locale.getDefault() );