8월 30, 2023

[Spring] PropertyPlaceHolderConfigurer 사용 - 속성 외부 분리

Spring에서는 외부 속성 파일을 사용하여 분리된 환경 설정을 가능토록 해준다. 예를 들어 로컬 개발 데이터베이스에 개발자들이 연결을 하여 테스트를 실시한다고 가정해보자. 그럴 경우 DB 정보를 외부 속성 파일을 사용하여 분리된 환경 설정을 한다면 개발자가 접근할 필요가 없는 DB 정보 등은 서버 관리자가 따로 보관하는 것을 가능하게 해준다. 

 

Spring에서는 PropertyPlaceHolderConfigurer 클래스를 통하여 위와 같은 기능을 지원해줄 수 있는 API 클래스를 제공한다. 

 

이를 위해서 우리는 속성파일 (ex) springtest.properties)를 아래와 같이 만든다.

dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/springtest?autoReconnect=true
dataSource.username=root
dataSource.password=test01!

 

위와 같이 PropertyPlaceHolderConfigurer properties 파일을 정의했다면 이제는 해당 Bean을 Spring 설정 파일에서 추가적으로 정의해주어야 한다. 

 

설정해주는 xml 파일에 아래와 같이 정의하는 것이다.

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="location" value="springtest.properties"/>
	</bean>

 

위의 xml 파일 설정을 보면 id 특성을 설정하지 않았는데, 이 이유는 Spring 컨테이너 자체가 자동으로 객체의 존재를 확인하고 기능을 활성화시키기 때문이다. 

 

또한 value로 springtest.properties라고만 적고 class path 전체를 적어두지 않아도 식별이 가능한 이유는 해당 파일을 class path의 root에 위치시켰다고 가정했기 때문이다. (이 경우는 src/main/resources 경로에 springtest.properties 파일을 위치시켰다) 


그러면 이렇게 설정한 springtest.properties 파일을 dataSource bean에 값을 치환시키려면 어떻게 해야할까? 이 또한 설정 xml 파일에 작성해주면 된다. 

 

	<bean id="dataSource"
	  class="org.apache.commons.dbcp.BasicDataSource" 
	  destroy-method="close">
		<property name="driverClassName" 
		  value="${dataSource.driverClassName}"/>
	    <property name="url" value="${dataSource.url}"/>
	    <property name="username" value="${dataSource.username}"/>
	    <property name="password" value="${dataSource.password}"/>
	</bean>

위와 같이 적어주면 실행시에 properties 파일에 있는 url, username, password 의 값으로 치환되어 실행되는 것이다. 

 

여기서 추가로 

destroy-method ="close"

라는 부분이 의미하는 바는 bean 객체의 scope가 종료되었을 경우 해당 class의 close method를 호출하겠다는 뜻으로 이해하면 된다. 

 

이런식으로 DB의 속성을 외부로 분리하게 되면 여러 개발자들이 동일 프로젝트의 소스 코드로 테스트를 할 시 각기 다른 DB를 구축하여 동시에 시스템을 구축할 수도 있어 매우 유용하다.