Extended Query Service - Mapping XML Files

Extended Query Service 초기화시, Extended Query Service는 속성 정의 파일에 정의되어 있는 sqlLoader bean에 기술된 mapping xml file을 로드한다. 그리고 사용자 요청시 mapping 정보를 기반으로 올바른 query를 찾아 실행한다.
개발자 편의를 위하여 Mapping XML file 작성방법이 기존 queryservice와 비교하여 상당부분이 변경되었으며 구성요소인 table-mapping tag와 queries tag별 변경점은 다음과 같다.

table-mapping tag 변경부분

Extended Query Service의 가장 큰 변경부분이라고 할 수 있는 부분으로 table-mapping tag를 전혀 기술할 필요가 없다. 조회한 결과의 column명 또는 alias명과 동일한 attribute명으로 자동 mapping이 되기 때문이며 테이블의 column명이 "_" 를 이용하는 형태이더라도 camel-case로 변경하여 mapping하므로 문제가 발생하지 않는다.

queries tag 변경부분

queries tag는 기존 Query Service와 큰 부분은 변경되지 않았으며 편의를 위해 설정하는 부분이 약간 변경되었다.
Tag Name
Description
Child Tag
query 쿼리문을 정의 한다.
* attribute설명
isDynamic : 동적 쿼리인지 아닌지 식별 
           (기존Query 서비스는 default가 false이었으나 true로 변경)
statement(필수)
param, result(선택)
statement 사용하고자 하는 쿼리문을 정의한다. Joined 쿼리에서 동일한 조회 칼럼명이 있을 경우, Alias 명을 부여해야 한다.
param 기존 Query 서비스는 param tag를 입력 Parameter의 개수와 순서에 맞게 추가하고 입력 Parameter의 SQL Type을 jdk API java.sql.Types에 정의된 값을 참조하여 param tag의 attribute인 type에 정의하여야 하였으나 Extended Query 서비스는 정의할 필요가 없다. default가 동적 query로 VO의 attribute의 type을 자동 인지하여 입력하기 때문이다.
* attribute 설정
type : parameter의 DBMS type
binding : CallableStatement경우 'IN' 또는 'OUT'를 선택
name : CallableStatement경우 Stored Procedure의 변수 이름 설정
result 해당 쿼리가 SELECT문일 경우에 사용하며, 쿼리 수행 결과를 저장할 클래스명을 정의한다. result tag가 지정되지 않았을 경우 쿼리 수행 결과에 대해 하나의 Row별로 칼럼명, 해당값을 쌍으로 Map에 put하고 Map들을 ArrayList에 담은 형태로 결과값을 리턴하게 된다.
* attribute 설명
class : 수행 결과를 저장할 클래스명
result-mapping(선택)
result-mapping 기존 Query 서비스의 경우 수행 결과를 저장할 클래스와 매핑되는 테이블이 존재하지 않을 경우, 조회된 칼럼별로 이에 매핑되는 해당 클래스의 attribute 명을 정의하여야 하였으나 table-mapping tag와 마찬가지로 자동 mapping이 이루어지므로 정의할 필요가 없다.
* attribute 설명
column : 조회된 칼럼명
attribute : 정의한 칼럼에 매핑되는 클래스의 attribute명

다양한 queries tag 설정 예제

  • 일반적인 사용
  • SELECT query문의 경우 table과 mapping되는 VO Class를 정의하지 않은 경우에 query수행 결과를 Column Name, 해당값을 Row별로 Map에 put하고 각 Row들에 대한 Map를 ArrayList형태로 리턴한다. get("Column name")를 통해서 해당 column의 값을 얻을 수 있다.
    위에서 언급한 바와 같이 입력 Parameter의 개수와 순서를 정의하는 param tag는 불필요하며 default로 동적 query로 인식된다. 이때 입력 Parameter명은 vo. (prefix) + attribute명 형태로 기술한다.
    <queryservice>
        <!-- skipped -->
        <queries>
           <query id="selectGeneral">
              <statement>
                 SELECT * FROM TBL_CUSTOMER WHERE SSNO like :vo.ssno
              </statement>
           </query>
        </queries>
    </queryservice>
  • result class를 이용할 경우
  • <result class=""integration.anyframe.services.query.vo.CustomerVO"/>와 같이 VO class를 정의하면 query문의 수행값이 해당 class의 settter를 통해 저장되고, getter를 이용해 결과값을 얻을 수 있다.
    <queryservice>
        <!-- skipped -->
        <queries>
           <query id="select">
              <statement>
                 SELECT * FROM TBL_CUSTOMER WHERE SSNO like ?
              </statement>
              <result class="integration.anyframe.services.query.vo.CustomerVO"/>
           </query>
        </queries>
    </queryservice>
  • dynamic query인 경우
  • isDynamic attribute의 default값이 true로 기존 Query 서비스와 달리 기술할 필요가 없으며 동일하게 velocity 문법을 지원한다.
    <queryservice>
        <!-- skipped -->
        <queries>
           <query id="dynamicsample">
              <statement>select NAME, ADDRESS from TBL_CUSTOMER 
                 where NAME like :vo.name
                      #if($vo.key.equals("true"))
                        OR NAME like '%test%'
                      #end>
              </statement>
           </query> 
        </queries>
    </queryservice>
  • LOB(Large Object)를 이용할 경우
  • LOB 파일의 경우 기본적으로 다른 Query 정의 방식과 같다.
    <queryservice>
        <!-- skipped -->
        <queries>
           <query id="lobsample">
              <statement>insert into binary values($vo.key,$vo.contents)</statement>
           </query>
        </queries>
    </queryservice>