Query Service - General Case

일반적으로 Query 서비스는 매핑 XML 파일에 정의되어 있는 매핑 정보와 쿼리문들을 이용하여 특정 쿼리문을 실행한다.

Query 서비스 속성 정의 파일 Sample

다음은 Query 서비스를 정의한 applicationContext-query-common.xml 과 Query 서비스에서 읽어들일 매핑 XML 파일의 위치를 정의한 applicationContext-query-sqlloader.xml 파일의 일부이다.
<bean id="queryService" class="anyframe.core.query.impl.QueryServiceImpl">
	<property name="jdbcTemplate" ref="jdbcTemplate"/>
	<property name="sqlRepository" ref="sqlLoader"/>
	<!-- 중략 -->
</bean>
<bean id="jdbcTemplate" class="anyframe.core.query.impl.jdbc.PagingJdbcTemplate">
  <property name="dataSource" ref="common_datasource" />
</bean>  
<!-- 중략 -->

<bean name="sqlLoader" class="anyframe.core.query.impl.config.loader.SQLLoader">
   	<config:configuration>
 		    <filename>classpath:/services/query/mappings/mapping-general-query.xml</filename>
 		    <!-- 중략 -->
	</config:configuration>		
</bean> 
<!-- 중략 -->

매핑 XML 파일 Sample

다음은 앞서 정의한 Query 서비스를 통해 로드된 mapping-general-query.xml 로, 테이블 매핑 정보와 다양한 쿼리문들을 포함하고 있다.
<queryservice>
    <table-mapping>
        <!-- 매핑할 테이블명과 클래스를 정의한다. -->
        <table name="TBL_CUSTOMER"
            class="integration.anyframe.services.query.vo.CustomerVO">
            <!-- DB의 칼럼명과 VO 클래스의 attribute를 매핑한다.-->
            <field-mapping>
                <dbms-column>ssno</dbms-column>
                <class-attribute>ssno</class-attribute>
            </field-mapping>
            <field-mapping>
                <dbms-column>name</dbms-column>
                <class-attribute>nm</class-attribute>
            </field-mapping>
            <field-mapping>
                <dbms-column>address</dbms-column>
                <class-attribute>addr</class-attribute>
            </field-mapping>
            <primary-key>
                <dbms-column>ssno</dbms-column>
            </primary-key>
        </table>
    </table-mapping>
    <queries>
        <!-- INSERT 쿼리문 -- >
        <query id="create" isDynamic="false">
            <statement>
                INSERT INTO TBL_CUSTOMER ( ssno, name, address ) VALUES (?,?,?)
            </statement>
            <param type="VARCHAR" />
            <param type="VARCHAR" />
            <param type="VARCHAR" />
        </query>
        <!-- SELECT 쿼리문 -- >
        <query id="selectGeneral" isDynamic="false">
            <statement>
                SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
            </statement>
            <param type="VARCHAR" />
        </query>
        <query id="selectUsingTableMapping" isDynamic="false">
            <statement>
                SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
            </statement>
            <param type="VARCHAR" />
            <result class="integration.anyframe.core.query.vo.CustomerVO"/>
        </query>
        <query id="selectUsingResultMapping" isDynamic="false">
            <statement>
                SELECT NAME FROM TBL_CUSTOMER WHERE SSNO like ?
            </statement>
            <param type="VARCHAR" />
            <result class="integration.anyframe.core.query.vo.CompositionCustomerVO">
                <result-mapping column="NAME" attribute="compositionName"/>
            </result>
        </query>
		<query id="selectUsingOnlyResultClass" isDynamic="false">
			<statement>
				SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
			</statement>
			<param type="VARCHAR" />
			<result class="integration.anyframe.services.query.vo.CamelCasedCustomerVO"/>
		</query>
        <!-- UPDATE 쿼리문 -- >
        <query id="update" isDynamic="false">
            <statement>
                UPDATE TBL_CUSTOMER SET ssno = ? , name = ?, address = ? WHERE ssno = ?
            </statement>
            <param type="VARCHAR" />
            <param type="VARCHAR" />
            <param type="VARCHAR" />
            <param type="VARCHAR" />
            <result class="integration.anyframe.core.query.vo.CustomerVO"/>
        </query>
        <!-- DELETE 쿼리문 -- >
        <query id="delete" isDynamic="false">
            <statement>
                DELETE FROM TBL_CUSTOMER WHERE ssno = ?
            </statement>
            <param type="VARCHAR" />
            <result class="integration.anyframe.core.query.vo.CustomerVO"/>
        </query>
    </queries>
</queryservice>

Query 서비스 테스트 코드 Sample

다음은 앞서 언급한 매핑 XML 파일에 정의된 INSERT, SELECT, UPDATE, DELETE 쿼리문을 실행하는 소스 코드 QueryServiceTestGeneral.java 이다.
/**
 * Query 서비스를 통해 DB에 신규 데이터를 입력하는 테스트 코드
 */
public void testInsertQuery() throws Exception{
	IQueryService queryService = (IQueryService) context.getBean("queryService");
	//create() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 INSERT를 실행한다.
	int rs = queryService.create("create"
	                              , new Object[] { "1234567890123", "AAAAA" , "seoul"});
}
/**
 * Query 서비스를 통해 DB에 입력된 데이터를 조회하는 테스트 코드
 */
public void testSelectQuery() throws Exception{
	IQueryService queryService = (IQueryService) context.getBean("queryService");
	//find() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 SELECT를 실행한다.
	
	//일반적인 경우
	ArrayList rsquery  = (ArrayList) queryService
	                                  .find("selectGeneral", new Object[] { "%12345%" });
	Map hsRsquery = new HashMap();
	for( int i = 0 ; i < rsquery.size() ; i ++ ){
		hsRsquery = (Map) rsquery.get(i);
		String name = (String) hsRsquery.get("name");
	}
	// table-mapping을 정의한 경우
	Collection rsqueryUsingTableMapping = queryService.find(
			"selectUsingTableMapping", new Object[] { "%12345%" });
	Iterator rsqueryItr = rsqueryUsingTableMapping.iterator();
	while (rsqueryItr.hasNext()) {
		CustomerVO customer = (CustomerVO) rsqueryItr.next();
		String name = customer.getNm();
	}

	// result-mapping을 정의한 경우
	Collection rsqueryUsingResultMapping = queryService.find("selectUsingResultMapping"
	                                                           , new Object[] { "%12345%" });
	Iterator rsqueryItr_01 = rsqueryUsingResultMapping.iterator();
	while (rsqueryItr_01.hasNext()) {
		CompositionCustomerVO compositionCustomer 
		                                       = (CompositionCustomerVO) rsqueryItr_01.next();
		String name =  compositionCustomer.getCompositionName();
	}
	
	// result class만 정의한 경우
	Collection rsqueryUsingOnlyResultClass = queryService.find(
			"selectUsingOnlyResultClass", new Object[] { "%12345%" });
	Iterator rsqueryItr_02 = rsqueryUsingOnlyResultClass.iterator();
	while (rsqueryItr_02.hasNext()) {
		CamelCasedCustomerVO camelCasedCustomerVO 
		    = (CamelCasedCustomerVO) rsqueryItr_02.next();
		String name = camelCasedCustomerVO.getName();
	}	
	
	// ...
}
/**
 * Query 서비스를 통해 DB에 입력된 데이터를 수정하는 테스트 코드
 */
public void testUpdateQuery() throws Exception {
	IQueryService queryService = (IQueryService) context.getBean("queryService");
	//update() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 UPDATE를 실행한다.
	int rs = queryService.update("update", new Object[] { "9999999999999", "AAAAA" 
	                                                         , "busan" , "1234567890123"});
}
/**
 * Query 서비스를 통해 DB에 입력된 데이터를 삭제하는 테스트 코드
 */
public void testDeleteQuery() throws Exception {
	IQueryService queryService = (IQueryService) context
	.getBean("queryService");
	//remove() : 매핑 XML 파일에 정의되어 있는 query id를 이용하여 DELETE를 실행한다.
	int rs = queryService.remove("delete", new Object[] { "9999999999999" });
}
앞서 소개된 샘플 테스트 코드를 포함하여 Query 서비스 소개 페이지에서 제공하는 모든 샘플 테스트 코드는 HSQL DB를 기반으로 실행된다. ( 단, ※ CallableStatement, LOB의 경우는 Oracle 9i, 10g를 기반으로 함. )

Resources

  • 다운로드
  • 샘플 테스트 코드를 포함하고 있는 anyframe-querytest-src.zip 파일을 다운받은 후, 테스트 환경 설정 을 참조하여 위에서 제시한 예제 코드를 실행해 볼 수 있다.
    Name
    Download
    anyframe-querytest-src.zip
    Download