#egov - 다중 DB 설정 DB 2개 이상 설정하기
본문 바로가기
Programming/eGovFramework 전자정부프레임워크

#egov - 다중 DB 설정 DB 2개 이상 설정하기

by 권가 2021. 3. 31.

이번 주제는 EgovFramework 전자 정부 프레임워크에서 Database mysql, oracle, maria, 등등 여러 Database server에 접속하는 방법을 알아보겠습니다!

저는 virtuoso라는 Database와 mysql Database 2개를 연동해보았습니다.

 


1.

pom.xml 에 연결할 DB 설정

<!-- mysql -->
        <dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.46</version>
		</dependency>
<!-- /mysql -->

2.

context-datasource.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:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
        
    <alias name="dataSource-virtuoso" alias="egov.dataSource"/>
    <alias name="dataSource-virtuoso" alias="dataSource"/>
    <alias name="dataSource-mysql" alias="dataSource-mysql"/>
    
    <!-- virtuoso -->
    <bean id="dataSource-virtuoso" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="virtuoso.jdbc4.Driver"/>
        <property name="url" value="jdbc:virtuoso://127.0.0.1:1111/charset=utf-8" />
        <property name="username" value="kwonga"/>
        <property name="password" value="1234"/>
		<property name="initialSize" value="10"/>
        <property name="maxActive" value="100"/>
        <property name="removeAbandoned" value="true"/>
    </bean>
    
    <!-- Mysql-->
    <bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/kwonga?useSSL=false" />
        <property name="username" value="kwonga"/>
        <property name="password" value="1234"/>
    </bean>    
    
</beans>

별칭도 지정해주고 bean에 2개의 database 정보를 입력해 지정해둡니다.

<property name="url" value="jdbc:mysql://127.0.0.1:3306/kwonga?useSSL=false" />의 ?useSSL=false는 ssl 인증 exception 제거하기 위해 임시로 붙여두었습니다~


3.

context-sqlMap

(처음 생성 후 sqlMapClient-virtuoso가 sqlMapClient로 되어있습니다.)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<!-- SqlMap setup for iBATIS Database Layer -->
	<!-- virtuoso -->
	<bean id="sqlMapClient-virtuoso" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:/egovframework/sqlmap/sql-map-config.xml"/>
		<property name="dataSource" ref="dataSource-virtuoso"/>
	</bean>
	<!-- mysql -->
	<bean id="sqlMapClient-mysql" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="classpath:/egovframework/sqlmap/sql-map-config-mysql.xml"/>
		<property name="dataSource" ref="dataSource-mysql"/>
	</bean>
</beans>

2개의 bean을 생성하며 레퍼런스만 바꾸어 줍니다!

virtuoso에 연결할 bean = context-datasource.xml의 bean id가 dataSource-virtuoso인 bean 지정

mysql에 연결할 bean = context-datasource.xml의 bean id가 dataSource-mysql인 bean 지정


 

 

4.

sql-map-config.xml 도 2개 만들어 줍니다.

(context-sqlMap에서 configLocation으로 설정한 값들과 매핑되는 곳)

sql-map-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	<sqlMap resource="egovframework/sqlmap/map/virtuoso.xml"/>
</sqlMapConfig>

 

sql-map-config-mysql.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
	<sqlMap resource="egovframework/sqlmap/map/mysql.xml"/>  
</sqlMapConfig>

주의

sql-map-config.xml 설정 파일에는 

<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

sql.xml 파일에는

<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

각각 따로 들어가야 한다.

이거 못찾아서 시간을 낭비한 기억이....

 

또한 

http://www.ibatis.com/dtd/sql-map-2.dtd 요렇게게 되어 있다면 http://ibatis.apache.org/dtd/sql-map-2.dtd 이렇게 수정해야한다.

http://www.ibatis.com/dtd/sql-map-config-2.dtd 요렇게 되어 있다면 http://ibatis.apache.org/dtd/sql-map-config-2.dtd 이렇게 수정해야 한다.


5.

service 생성

virtuoso service

public interface VirtuosoService {
	int countVirtuoso();
}

mysql service

public interface MysqlService {
	int countMysql();
}

6.

serviceImpl 생성

virtuoso service impl

@Service("VirtuosoService")
public class VirtuosoServiceImpl implements VirtuosoService{

	@Resource(name="virtuosoDAO")
	private VirtuosoDAO dao;

	@Override
	public int countVirtuoso() {
		return dao.countVirtuoso();
	}
}

mysql service impl

@Service("MysqlService")
public class MysqlServiceImpl implements MysqlService{
		
	@Resource(name="mysqlDAO")
	private MysqlDAO dao;

	@Override
	public int countMysql() {
		return dao.countMysql();
	}
}

7.

DAO 생성

VirtuosoDAO

@Repository("virtuosoDAO")
public class VirtuosoDAO extends EgovAbstractDAO {

	public int countVirtuoso() {
		return (int) select("countVirtuoso");
	}
}

MysqlDAO

@Repository("mysqlDAO")
public class MysqlDAO extends EgovMysqlDAO {

	public int countMysql(){
		return (int) select("countMysql");
	}
}

여기서 핵심

VirtuosoDAO에는 extends EgovAbstractDAO로 되어 있고

MysqlDAO에는 extends EgovMysqlDAO로 되어 있습니다.

egov 전자 정부 프레임 워크는 database 접근 시 EgovAbstractDAO로 접근하게 되어 있습니다.

그러나 저희는 DB 하나를 더 추가하면서 위에서 virtuoso 설정을 내용만 mysql로 바꾸어 추가 작업을 반복해 왔죠.

 

virtuoso 설정들은 EgovAbstractDAO로

mysql 설정들은 EgovMysqlDAO로 가도록 해야하죠.

(설정을 했으니 설정을 써야합니다!)

 

따라서, EgovAbstractDAO는 virtuoso DB와 맞물려 작동하는 것이고

EgovMysqlDAO는 mysql DB와 맞물려 작동하는 것이므로 DAO도 2개가 있어야해요!

egov에서 친절하게 만들어준 EgovAbstractDAO를 하나 더 만들어야합니다.

 


8.

즉, 친절하게 만들어준 EgovAbstractDAO를 extends해 EgovMysqlDAO를 만들어 주면 됩니다.

context-sqlMap.xml에 작성한 bean id를 EgovAbstractDAO, EgovMysqlDAO의 @Resource에 주입

<bean id="sqlMapClient-virtuoso" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
  ~~
</bean>

<bean id="sqlMapClient-mysql" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
  ~~
</bean>

 

EgovAbstractDAO.java

(처음 생성하시면 @Resource(name = "sqlMapClient") 로 되어 있습니다.)

public class EgovAbstractDAO extends SqlMapClientDaoSupport {
	//...중간 생략
    @Resource(name = "sqlMapClient-virtuoso")
    public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
        super.setSqlMapClient(sqlMapClient);
    }
    //...중간 생략
}

EgovMysqlDAO.java

public class EgovMysqlDAO extends EgovAbstractDAO {
	@Override
	@Resource(name = "sqlMapClient-mysql")
	public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
		super.setSuperSqlMapClient(sqlMapClient);
	}
}

이로써 다중 DB를 사용할 수 있게 되었습니다!

하나 더 추가해 Oracle을 사용하고 싶다 하면 위의 순서와 동일하게 Oracle 설정들을 쭉 추가해주시고 EgovOracleDAO.java를 생성해 EgovAbstractDAO를 상속받아 사용하시면 됩니다.

 

아래에서 Syntax를 보도록 하겠습니다


패키지 구조

Package Explorer

syntax

@Controller
public class Controller {
	@Resource(name = "VirtuosoService")
	private VirtuosoServiceImpl virtuosoService;

	@Resource(name = "MysqlService")
	private MysqlServiceImpl mysqlService;

	@RequestMapping({ "/main.do" })
	public void dbTest() {
		virtuosoService.countVirtuoso();
		mysqlService.countMysql();
	}
}

Controller -> VirtuosoService, VirtuosoServiceImpl

Controller -> MysqlService, MysqlServiceImpl

 

@Service("VirtuosoService")
public class VirtuosoServiceImpl implements VirtuosoService{

	@Resource(name="virtuosoDAO")
	private VirtuosoDAO dao;

	@Override
	public int countVirtuoso() {
		return dao.countVirtuoso();
	}
}

@Service("MysqlService")
public class MysqlServiceImpl implements MysqlService{
		
	@Resource(name="mysqlDAO")
	private MysqlDAO dao;

	@Override
	public int countMysql() {
		return dao.countMysql();
	}
}

VirtuosoService, VirtuosoServiceImpl -> VirtuosoDAO extends EgovAbstractDAO

MysqlService, MysqlServiceImpl -> MysqlDAO extends EgovMysqlDAO

public class EgovAbstractDAO extends SqlMapClientDaoSupport {
	//...중간 생략
    @Resource(name = "sqlMapClient-virtuoso")
    public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
        super.setSqlMapClient(sqlMapClient);
    }
    //...중간 생략
}
// extends EgovAbstractDAO
@Repository("virtuosoDAO")
public class VirtuosoDAO extends EgovAbstractDAO {

	public int countVirtuoso() {
		return (int) select("countVirtuoso");
	}
}


public class EgovMysqlDAO extends EgovAbstractDAO {
	@Override
	@Resource(name = "sqlMapClient-mysql")
	public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
		super.setSuperSqlMapClient(sqlMapClient);
	}
}
// extends EgovMysqlDAO
@Repository("mysqlDAO")
public class MysqlDAO extends EgovMysqlDAO {

	public int countMysql(){
		return (int) select("countMysql");
	}
}

VirtuosoDAO extends EgovAbstractDAO -> virtuoso.xml

MysqlDAO extends EgovMysqlDAO -> mysql.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="virtuoso">
	<typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
	<typeAlias  alias="VirtuosoVO" type="com.tistory.kwongas.app.domain.VirtuosoVO"/>
	
	<resultMap id="VirtuosoMap" class="VirtuosoVO">
		<result property="name" column="name"/>
		<result property="ph" column="ph"/>
	</resultMap>
	
<!-- virtuoso 개수 조회 -->
	<select id="countVirtuoso" resultClass="java.lang.Integer">
		<![CDATA[
		select count(*) from KWONGA.MULTIDB.virtuoso 
		]]>
	</select>
</sqlMap>
	
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="virtuoso">
	<typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
	<typeAlias  alias="MysqlVO" type="com.tistory.kwongas.app.domain.MysqlVO"/>
	
	<resultMap id="MysqlMap" class="MysqlVO">
		<result property="name" column="name"/>
		<result property="ph" column="ph"/>
	</resultMap>
	
<!-- mysql 개수 조회 -->
	<select id="countMysql" resultClass="java.lang.Integer">
		<![CDATA[
		select count(*) from KWONGA.MULTIDB.mysql 
		]]>
	</select>
</sqlMap>
	

댓글