[전자정부프레임워크] 2개 이상의 DB를 연동하는 법
- DB/ibatis, mybatis
- 2019. 8. 19.
전자정부프레임워크는 기본적으로 iBatis 혹은 MyBatis를 이용하여 DB를 연동하게 된다. 일반적으로 DAO단에서 DB를 호출 할 때 sqlMapClient를 호출하게 되는데 전자정부프레임워크에는 이러한 부분이 노출되지 않고 숨겨져 있어서 다중으로 호출을 하는 분들이 힘드실 수 있다.
이에 간단한 가이드를 제공하고자 한다. 우선 DB를 연동하기 위해서는 Bean을 신규로 2개를 생성해야 하는데 우선 dataSource를 신규 생성해야 한다.
egovframework/spring/context-datasource.xml을 열어서
<!-- Mysql (POM에서 commons-dbcp, mysql-connector-java 관련 라이브러리 설정 ) -->
<bean id="dataSource" 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/test?serverTimezone=UTC" /> -->
<property name="username" value="test"/>
<property name="password" value="test" />
</bean>
<!-- Mysql Second -->
<bean id="testDataSource" 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/testtest?serverTimezone=UTC" />
<property name="username" value="testtest"/>
<property name="password" value="testtest" />
</bean>
이와같이, 기존의 dataSource 말고 하나를 더 추가하여, 다른 이름의 bean을 만든 후
egovframework/spring/context-sqlMap.xml 파일을 열어서
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:/egovframework/sqlmap/admin/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient2" class="egovframework.rte.psl.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:/egovframework/sqlmap/admin/sql-map-config2.xml"/>
<property name="dataSource" ref="testDataSource"/>
</bean>
위와 같이, sqlMapClient 역시 한벌 더 생성하며 ref로는 기존 dataSource가 아닌 신규 dataSource id를 지정한다(여기서는 testDataSource)
마지막으로 전자정부프레임워크는 sqlMapClient를 설정하는 곳이 추상 클래스에 담겨져 있다.
EgovAbstractDAO 파일을 열어보면, 아래와 같은 코드를 확인할 수 있다.
@SuppressWarnings("deprecation")
public abstract class EgovAbstractDAO extends SqlMapClientDaoSupport {
/**
* EgovAbstractDAO 는 base class 로만 사용되며 해당 인스턴스를 직접 생성할 수 없도록 protected constructor 로 선언하였음.
*/
protected EgovAbstractDAO() {
// PMD abstract Rule
// - If the class is intended to be used as a base class only (not to be instantiated directly)
// a protected constructor can be provided prevent direct instantiation
}
/**
* Annotation 형식으로 sqlMapClient 를 받아와 이를 super(SqlMapClientDaoSupport) 의 setSqlMapClient 메서드를 호출하여 설정해 준다.
*
* @param sqlMapClient - ibatis 의 SQL Map 과의 상호작용을 위한 기본 클래스로
* mapped statements(select, insert, update, delete 등)의 실행을 지원함.
*/
@Resource(name = "sqlMapClient")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSqlMapClient(sqlMapClient);
public void setSuperSqlMapClient의 Resource 명을 보면, sqlMapClient로 설정된 것을 확인할 수 있고, 이 추상화 클래스를 쓰면 DB 설정의 명칭은 sqlMapClient로만 받아야 된다는 의미랑 같다. 2개를 사용하기 위해서는 이와 동일한 추상화 클래스를 하나 더 생성하거나, 이 추상화 클래스를 계승하는 다른 추상화 클래스를 만들면 된다.
public abstract class TestAbstractDAO extends EgovAbstractDAO {
@Override
@Resource(name = "sqlMapClient2")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
이와 같이 추상클래스를 하나 더 생성하여, setSuperSqlMapClient를 Override하여 변경한 후 사용하면 기존 sqlMapClient이외의 bean ID 값의 설정을 읽을 수 있게 된다.
'DB > ibatis, mybatis' 카테고리의 다른 글
[전자정부프레임워크] iBatis 다중 Datasource 사용법 (0) | 2020.07.28 |
---|