Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[springframework] confing properties re-loading 기능

OpenSource/Spring MVC 2014.01.17 21:13
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

[springframework] confing properties re-loading 기능

 

1. 배 경

2. 구 현

3. 결 과 

4. 참조 사이트


<< 배 경 >>

Spring을 사용하면서 config properties 파일이 WAS의 재가동 없이 반영 되어야 하는 경우가 있다.

찾아보았더니 org.apache.commons.configuration.PropertiesConfiguration를 통해서 구현 할 수 었다!!


<< 구 현 >>

   1) spring의 context-properties.xml(properties location이 있는 context) 에서 bean을 만든다.

   - context-properties.xml 부분

     <context:property-placeholder location="classpath:properties/config.properties"/>  


     이 부분 추가!! value에서 path부분에서 너무 많은 소요를 하였다..ㅠ.ㅠ...classpath: 를 넣었었다...

     <bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">            <constructor-arg type="java.lang.String"  value="properties/config.properties" />

      <property name="reloadingStrategy" ref="reloadingStrategy" />

</bean>


    <bean id="reloadingStrategy" 

          class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />    


  - bean이 등록이 되었다면(WAS 기동 시 잘 읽어들인다면), @Autowired를 하여 사용 하면 된다.

    @Autowired

    private PropertiesConfiguration runtimeProperties;


    public String getConfigProperites() {

        return (String)runtimeProperties.getProperty("config.test.acet");

    }



<< 결과 >>

테스트로 2가지를 해보았다.

@Value와 @Autowired private PropertiesConfiguration  2가지 버전으로 테스트를 하였다.

  [ 결과 ]

   getConfigProperites()=>486486

   value--->1000004


config.properties의 내용은 아래와 같다.

   # properties test

   config.test.acet=1000004


소스에서는 

Value는 @Value("${config.test.acet}")

             private String name;  로 가져와서 찍어주었고,

PropertiesConfiguration 는 위의 소스 처럼 가져와서 찍어주었다.


System.out.println("getConfigProperites()=>"+getConfigProperites());

System.out.println("value--->"+name);


WAS는 Tomcat 6.0을 사용하였고, local 에서 테스트를 위해 아래와 같이 설정을 해주어야 한다.

단, server.xml에서 다음과 같이 수정을 해줘야 한다.(very important~!!!)

<Host appBase="webapps" autoDeploy="false" name="10.214.184.86" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">


<Context docBase="ktdsOssDevPlay" path="/" reloadable="false" source="org.eclipse.jst.jee.server:ktdsOssDevPlay"/></Host> 


그런 다음 tomcat에서 Use workspace metadata를 사용하였으며 (Server 찍고~ 마우스 우클릭에서 Properties에서 선택 가능 ) 

C:\ACET\workingSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\ktdsOssDevPlay\WEB-INF\classes\properties에서 즉, 배포 된 녀석(config.properties)을 수정하였다. 486486으로^-^/


참조 사이트는 너무 이것저것 봐서...대충 띄워져있는 것만 써놨다. 그냥 구글링을 하시면 됩니다~


<< 참조 사이트 >>

1) http://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration/PropertiesConfiguration.html#PropertiesConfiguration(java.io.File)


2) https://jira.springsource.org/browse/SPR-4714


3) http://blog.naver.com/PostView.nhn?blogId=leehyogun&logNo=160766551


4) http://goodwilldd.blogspot.kr/2012/09/spring-properties-reload_13.html


아! PropertiesConfiguration.class를 보면 아래와 같다.

public class PropertiesConfiguration extends AbstractFileConfiguration { 블라블라~중에서 

발췌한 내용이다. 여기서 보아야 할 것은 PropertiesConfiguration의 bean을 만들 때 생성자를 만드는 부분이 있는데 그 생성자를 만들 때 어떻게 생성 하는지이다.

File, String, Url 등등 을 파라미터로 받아서 생성이 가능하다는 것이다.

더보기




                               - END - 




저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • 행인 2014.11.20 11:44 신고 답글 | 수정/삭제 | ADDR

    안녕하세요. Spring 환경에서 properties 를 톰캣 재기동 없이 변경하는 방법에 대해 찾다가 오게 되었는데요.글에서 설명해주신대로 xml 에 내용 세팅하고 @Autowired 로 프로퍼티에서 데이터를 잘 꺼내와서 사용하고 있는데 톰캣 기동중 프로퍼티를 변경하면 변경내용을 읽어오질 못하고 있습니다.
    톰캣에 대한 설정도 글에 쓰신대로 변경해주었고요.. 뭔가 에러가 나는게 아니라 어디가 잘못되었는지 어느걸 추가로 확인해야하는지도 모르는 상태 이고요 ㅜ_ㅡ
    제가 테스트 한 사항은 웹화면에서 파일을 업로드 하는데 업로드 경로를 프로퍼티에 지정해주고 업로드 요청 시 해당프로퍼티에서 경로를 가져와 등록합니다.
    로컬에서 톰캣 기동으로 테스트를 진행하였고 처음 업로드 시 경로와 도중에 프로퍼티에서 업로드 경로 수정 후 재업로드 시 경로를 확인하였는데 바뀐 경로가 적용이 안되더라고요...
    뭘 확인해야할지 감도 안잡히는데 어떻게 하면 좋을지..

  • 행인 2014.11.20 11:48 신고 답글 | 수정/삭제 | ADDR

    실제 소스상 설정 내용은 아래와 같습니다.
    ***** context-common.xml *******
    <bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg type="java.lang.String" value="setting.properties" />
    <property name="reloadingStrategy" ref="reloadingStrategy" />
    </bean>

    <bean id="reloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />

    해당 파일에 위처럼 설정내용을 세팅하였고 해당파일은 context-root.xml 파일에
    <beans:import resource="context-common.xml" /> 로 지정되어있습니다.

    해당 xml 은 web.xml 에 지정한 상태이고
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/classes/config/spring/context-root.xml
    </param-value>
    </context-param>

    실제 서버에서 사용은 ServiceImpl 단에서
    @Autowired
    PropertiesConfiguration propertiesConfiguration;

    오토와이드 선언 후
    propertiesConfiguration.getString("FILE_ROOT";)
    이런식으로 파일경로를 가져와 사용하고 있습니다.

    경로는 잘 가져옵니다만 톰캣 기동 중 경로를 수정하면 수정 된 경로를 가져오지 못하고 있습니다..

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.11.20 16:42 신고 수정/삭제

      안녕하세요!
      우선은 context-common.xml 에서 setting.properties를 가져와서 사용하시는건가요?
      <context:property-placeholder location="classpath:properties/setting.properties"/> <- 요부분이 보이질 않네요

      그리고 스프링쪽 셋팅중에 <beans:import resource="context-common.xml" /> 이부분을 context-root.xml 파일에서 import하지마시고 순서가 중요하니!

      스프링컨테이너에 올리실 때 저부분을 아래처럼 web.xml올라갈때 load시켜보세요
      <servlet>
      <servlet-name>AcetTest</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      classpath:applicationContext-servlet.xml
      </param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      </servlet>

      <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
      classpath:applicationContext.xml,
      classpath:context-common.xml
      </param-value>
      </context-param>
      그리고 포스팅에 씌여져있는데로 톰캣에서 autoDeploy등 설정 하신 뒤에
      직접 배포 된것을 수정해서 테스트해보셔야 합니다~

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바