Spring & Springboot/올인원 스프링 프레임워크

프로퍼티란?

YJ_ma 2023. 12. 4. 15:59

프로퍼티의 개념

⭐ 완성된 프로그램을 배포하기 전에 개발자는 고려해야할 사항⭐

프로그램을 개발할 때 데이터베이스를 개발에 사용하는 것과 실제 서비스에 사용하는 것으로 이원화하는 것이다.

💡이렇게 데이터베이스를 이원화하는 이유?

서비스DB의 데이터는 사용자의 중요한 데이터이기 때문에 개발자가 개발 또는 테스트의 목적으로 사용해서는 안되기 때문이다. 

데이터베이스를 이원화한다면 프로그램 코드에도 변화가 있어야한다. 개발 시점에는 개발 DB에 접속해야 하지만, 프로그램을 배포할 때는 서비스DB에 접속할 수 있도록 데이터베이스의 주소, 이름, 계정 정보 등을 변경해서 배포해야 하기 때문이다. 

다음은 데이터베이스 접속 정보가 명시되어 있는 jdbc-context.xml이다.

<!-- MariaDB connection 객체 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
    <property name="url" value="jdbc:mariadb://127.0.0.1:3306/db_library" />
    <property name="username" value="root" />
    <property name="password" value="system" />
</bean>

 

jdbc:mariadb://127.0.0.1:3306/db_library를 개발DB의 주소(url)라고 한다면 서비스DB의 주소는 달라진다. 또한 계정 정보(username, password)도 달라질 수 있다. 이렇게 데이터베이스를 이원화하면 개발자는 개발과 배포 단계를 구분해서 데이터베이스 접속 정보를 매번 변경해야 한느 번거로움이 발생한다.

 

이에 스프링에서는 이런 번거로움을 해겨핳기 위해서 공용으로 사용 가능한 프로퍼티를 제공한다.

개발자는 ○ ○ ○.properties 파일을 만들어서 다양한 설정 값들을 정의할 수 있고, 필요한 곳에서 언제든지 사용이 가능하다. 설정 값은 key=value 형태로 정의한다. 그럼 데이터베이스 설정 값을 프로퍼티에 정의해서 개발DB와 서비스DB를 편리하게 구분해서 사용할 수 있도록 해본다.

properties 사용 방법

[spring] 폴더에 [properties] 폴더를 만들고, dev.info.properties와 real.info.properties 파일을 생성한다.

· dev.info.properties : 개발 단계의 설정 값들을 정의

· real.info.properties : 서비스 단계에 필요한 설정 값들을 정의

 

먼저 dev.info.properties에 개발DB 접속 정보를 다음과 같이 정의한다.

db.driver=org.mariadb.jdbc.Driver
db.url=jdbc:mariadb://127.0.0.1:3306/db_library
db.username=root
db.password=system

 

다음으로 real.info.properties에 서비스DB 접속 정보를 정의한다.

· real.info.properties에 정의한 서비스DB는 실제로는 존재하지 않는다. 데이터베이스를 구분하기 위한 용도로 사용한다.

db.driver=org.mariadb.jdbc.Driver
db.url=jdbc:mariadb://192.168.101.5:3306/db_library_real
db.username=admin
db.password=0000

 

프로그램이 실행될 때 상황에 따라서 dev.info.properties와 real.info.properties를 구분할 수 있어야 한다.

[spring] 폴더에 properties-context.xml을 만들고 다음과 같이 코딩한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
		
	<util:properties id="infoProperty" location="/WEB-INF/spring/properties/dev.info.properties"/>
	
</beans>

 

스프링 컨테이너에 등록하기 위해서 web.xml에 <context-param>에 properties-context.xml을 추가한다.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring/root-context.xml
    /WEB-INF/spring/jdbc-context.xml
    /WEB-INF/spring/security-context.xml
    /WEB-INF/spring/mail-context.xml
    /WEB-INF/spring/file-context.xml
    /WEB-INF/spring/properties-context.xml
    </param-value>
</context-param>

 

프로퍼티 작업이 끝났으므로 jdbc-context.xml에서 데이터베이스 접속 정보를 프로퍼티에서 가져오도록 변경한다.

<!-- MariaDB connection 객체 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="#{infoProperty['db.driver']}" />
    <property name="url" value="#{infoProperty['db.url']}" />
    <property name="username" value="#{infoProperty['db.username']}" />
    <property name="password" value="#{infoProperty['db.password']}" />
</bean>

 

프로젝트를 재실행하면 정상으로 동작을 한다.

 

하지만 properties-context.xml의 location을 /WEB-INF/spring/properties/real.info.properties로 설정하면 서비스DB가 실제로 존재하지 않기 때문에 데이터베이스 기능에 에러가 발생한다.

이처럼 프로젝트에서 공용으로 사용해야 하는 데이터가 있을 때 사용하면 프로젝트를 효율적으로 관리할 수 있다.