파워노트

spring properties 에 대해서... 본문

spring legacy

spring properties 에 대해서...

파워킴 2022. 3. 4. 19:24
반응형

* 대충 정리 하자면 spring 3.1 정도에서  좀 변화가 있었던거 같다.

 


# 일반적인 xml 설정. 

Spring 3.1이전에는<context:property-placeholder>를 정의하면 PropertyPlaceholderConfigurer를 사용하였다. Environment를 이용해 해당값을 가져올수 있다.
물론 spring 3.1 이후에도 사용가능 하다.
<context:property-placeholder location="/WEB-INF/config/jdbc-${spring.profiles.active}.properties"  file-encoding="UTF-8" />

# property의 사용 

[ application.properties ]

app.message.hello="i am a boy"

[ class ]

@Value("${app.message.hello}")
String hello;

[ class 내에서의 사용 ]

log.info("hello : {}", hello);

# spring 3.1 이후 변화

spring 3.1 이후 부터는 PropertySourcesPlaceholderConfigurer를 내부에서 사용하고 있으며 ${...} 값을 찾지 못하면 Environment에서 Properties를 가져온다. 그러나 Environment 변수에는 직접적으로 setting할수는 없어 Environment 변수 setting이 필요한 경우에는 PropertySource를 통해 사용자정의 구현이 필요 하다.

# PropertySourcesPlaceholderConfigurer  xml 설정. 

<beans:bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
   <!-- 아래 properties 목록에서 없는 properties는 무시 -->
   <beans:property name="ignoreResourceNotFound" value="true" />
       <!-- 만약 설정 요소가 존재하지 않아도 서버를 멈추지 않고 정상적으로 작동될 수 있도록 해줍니다. -->
   <beans:property name="ignoreUnresolvablePlaceholders" value="true" />
   <beans:property name="locations">
      <beans:list>
         <beans:value>classpath:application.properties</beans:value>
         <beans:value>classpath:application-${spring.profiles.active}.properties</beans:value>
         <beans:value>classpath:test.properties</beans:value>
      </beans:list>
   </beans:property>
</beans:bean>

# property의 설정이나 사용은 동일 하다.


# Environment 환경변수 값에 property setting ( PropertySources )

Environment 환경변수에 직접 properties 값을 로딩할 수 있다. 
@Configuration
@PropertySources({
        @PropertySource("classpath:application.properties"),
        @PropertySource(value = "classpath:/application-${spring.profiles.active}.properties", ignoreResourceNotFound = true)
})
public class AppConfig {

}

# property의 사용 

[ application.properties ]

app.message.hello="i am a boy"

[ application-prod.properties ]

app.message.hello="how are you?"

[ class ]

@Autowired
Environment env;

@Value("${app.message.hello}")
String hello;

[ class 내에서의 사용 ]

environment 변수 및 Value를 통한 사용 모두 가능 하다 .
log.info("app.message.hello {}" , env.getProperty("app.message.hello") );
log.info("properties app.message.hello {}" , hello );

# 추가적으로 Apache  PropertiesConfiguration 

apache commons lib를 통한  프로퍼티변경을  톰캣 재기동없이 반영할 수 있다. 서버 운영시에 가장 많이 사용되지 않나 싶다. 

[ pom.xml ] dependency 설정 

<!-- commons-configuration PropertiesConfiguration 를 통한 property 관리 -->
<dependency>
   <groupId>commons-configuration</groupId>
   <artifactId>commons-configuration</artifactId>
   <version>1.10</version>
</dependency>

[ servlet-context.xml ]

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

<bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">
   <constructor-arg type="java.lang.String" value="${app.runtime.property.filepath}" />
   <property name="reloadingStrategy" ref="propertyReloading" />
</bean>
${app.runtime.property.filepath} 는  properties 로 사용할 외부 경로를 넣어주면 된다. 

[ class 내  사용을 위한 주입 ]

@Autowired
private PropertiesConfiguration runtimeProperties;

[ class 내에서의 사용 ]

model.addAttribute("app.title", runtimeProperties.getProperty("app.title"));
model.addAttribute("app.configYN", runtimeProperties.getProperty("app.configYN"));

 

반응형
Comments