[전자정부프레임워크] 2개 이상의 DB를 연동하는 법

    전자정부프레임워크는 기본적으로 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 값의 설정을 읽을 수 있게 된다.

    반응형

    댓글

    Designed by JB FACTORY