웹 애플리케이션을 개발하다보면 MessageSource가 변경될 경우 MessageSource를 반영하기 위하여 애플리케이션 서버를 재시작하는 경우가 많다. MessageSource가 변경될 때마다 서버를 재시작하는 것은 여간 짜증나는 일이 아닐 수 없다. 이 같은 문제점을 해결하기 위하여 Spring 프레임워크에서는 ReloadableResourceBundleMessageSource 클래스를 통하여 지원하고 있다.
그러나 이 같은 기능은 개발시에는 유용하게 사용할 수 있지만 실제로 애플리케이션을 운영하고 있는 시스템에서 이와 같은 방식으로 운영할 경우 문제가 발생할 소지가 있기 때문에 가능하면 사용하지 않는 것이 좋은 방법이다.
ReloadableResourceBundleMessageSource 클래스를 사용할 때 ResourceBundleMessageSource와 다른 점은 사용할 MessageSource파일(보통 Properties파일)을 클래스패스에 두지 말아야한다는 것이다. 애플리케이션 서버는 클래스패스에 있는 모든 리소스를 캐싱하기 때문에 파일을 변경하더라도 반영되지 않는다. 따라서 ReloadableResourceBundleMessageSource 클래스를 사용하기 위해서는 WEB-INF/classes 디렉토리 이외의 다른 디렉토리에 MessageSource 파일을 관리해야한다. 예를 들어 WEB-INF/messages 디렉토리와 같은 곳에서 관리해야한다.
이 문서는 Spring 프레임워크 워크북의 7장 예제를 ReloadableResourceBundleMessageSource을 사용하도록 변경하도록 하겠다.
먼저 applicationContext.xml 파일에서 다음과 같이 설정되어 있는 부분을 ReloadableResourceBundleMessageSource 클래스를 사용하도록 수정한다.
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>DBQuery</value> <value>Messages</value> </list> </property> </bean>
위와 같이 ResourceBundleMessageSource 클래스를 사용하고 있는 부분을 다음과 같이 수정한다. 이 문서에서는 MessageSource파일을 관리하고 있는 디렉토리를 WEB-INF/messages라고 가정하고 설정하였다.
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <value>/WEB-INF/messages/DBQuery</value> <value>/WEB-INF/messages/Messages</value> </list> </property> <property name="cacheSeconds" value="5"/> </bean>
ReloadableResourceBundleMessageSource 클래스를 사용할 때 추가할 부분은 파일이 변경되었는지를 모니터링하기위한 시간을 설정하는 것이다. 위와 같이 변경한 다음 MessageSource파일을 변경후 서버 재시작 없이 반영되는지를 확인해보기 바란다.
위와 같이 Spring 프레임워크 워크북의 예제를 테스트한 결과 org.springframework.context.support.MessageSourceAccessor 클래스를 이용하여 메세지를 추출하는 경우에는 제대로 반영이 되지 않고, JSP의 버튼 이름, 메시지 등에 대해서는 정상적으로 반영된다는 것을 확인할 수 있었다.
MessageSourceAccessor 클래스를 이용할 경우 리로딩한 MessageSource의 내용이 반영되지 않는 이유에 대해서는 좀 더 분석할 필요성이 있다.
출처 : Tong - 레이쥬님의 Java통
SSISO Community