목차

쿼리 작성 가이드 (QueryParser Library)

개요

라이브러리 세팅 방법 (향후 업그레이드 대응)

// 기존 library load항목에 'queryParser' 추가
$autoload['libraries'] = array( ... , 'queryParser'); 

QueryParser 라이브러리 사용 법

QueryParser는 CI의 Model Layer에서 호출하여 사용 할 수 있도록 설계되어 있다.

SQL문 작성

SQL문 위치

XML문서 layout

XML문서는 기본적으로 다음과 같이 작성한다

QueryParser_용_XML_Lauout.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--SQL 그룹 및 namespace 정의, 현재 QueryParser에서 namespace 는 활용하지 않음 -->
<mapper namespace="sql.product">
    <!-- 개별 SQL문 지정, id는 실제 프로그램에서 query를 불러 올 때 지정하는 key 값으로, 동일 XML파일 내에서 중복되지 않도록 주의가 필요하다 -->
    <sql id="get_price_change_history">
        ... query ...
    </sql>
</mapper>

변수 바인딩

변수_바인딩_예제.xml
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="sql.product">
    <sql id="get_price_change_history">
        call xone_ktk_new.sp_s_sss1101_30_Search (
              #{company}
            , '30'
            , #{brand}
            , #{style}
            , ''
            , #{page}
            , #{rows}
        )
    </sql>
</mapper>
변수할당.php
 $data['param1'] = '1234';
 $data['param2'] = 1234;
 $data['param3'] = '테스트1';
 $data['param4'] = '테스트2';
 $data['param5'] = null;
바인딩결과.sql
// 요청
CALL sp_1(#{param1}, #{param2}, #{param3}, '#{param4}', #{param5}, #{param6});
// 결과
CALL sp_1('1234', 1234, '테스트1', '테스트2', NULL, NULL);

동적 쿼리 작성

IF문 사용
if_구문_사용_예제.xml
<sql id="sample.1">
    SELECT *
      FROM table
     WHERE type = #{type}
     <if test="#{userId} != ''">
       AND userId = #{userId}
     </if>
     <if test="#{empNo} != ''">
       AND empNo = #{empNo}
     </if>
</sql>
해당_SQL_바인딩_예제_요청.php
$data['type'] = 'T001';
$data['empNo'] = 2017062201;
parse('sample.1', $data);
해당_SQL_바인딩_예제_결과.sql
    SELECT COUNT(1) AS cnt
      FROM TABLE
     WHERE TYPE = 'T001'
       AND empNo = 2017062201
Include 사용
include_구문_사용_예제.xml
<sql id="sample.2.list">
    SELECT *
      FROM table
     WHERE
       <include refid="sample.2.where" />
</sql>
<sql id="sample.2.count">
  SELECT count(1) AS cnt
    FROM (
      <include refid="sample.2.list" />
    ) t
</sql>
<ref id="sample.2.where">
    type = #{type}
    <if test="#{userId} != ''">
      AND userId = #{userId}
    </if>
    <if test="#{empNo} != ''">
      AND empNo = #{empNo}
    </if>
    // 부등호 등의 식은 CDATA 를 사용하여 태그로 인식되지 않도록 보호한다.
    <![CDATA[
        AND regdate >= #{regdate}
    ]]>
</ref>
sample.2.list_바인딩_예제_결과.sql
    SELECT *
      FROM TABLE
     WHERE TYPE = 'T001'
       AND empNo = 2017062201
sample.2.count_바인딩_예제_결과.sql
    SELECT COUNT(1) AS cnt
      FROM (
        SELECT *
          FROM TABLE
         WHERE TYPE = 'T001'
           AND empNo = 2017062201
      ) t

쿼리 로드(Load)

constructer에서_해당Model용_공통_XML_로드.php
function __construct() {
    parent::__construct();
    // 생성자에서 product.xml을 호출하여 모든 method가 별도 선언 없이 XML 내 쿼리를 사용 할 수 있도록 함
    $this->queryparser->load("product");
}
Method에서_필요에_따라_별도_XML_로드.php
function someMethod() {
    $this->usersQuery = $this->queryparser->load("user");
}

쿼리 호출

KTK_Model 사용 시

Model에서 아래와 같이 KTK_Model 을 extends 할 경우에는 아래와 같이 간결하게 사용 할 수 있다.

쿼리_해석_및_DB호출_결과_수신_1.php
// parsing 할 데이터 임시 생성(예제용)
$data['page'] = 1;
$data['rows'] = 15;
 
// $data를 이용, get_price_change_history 분석 후 퀴리 실행
$query=$this->query("get_price_change_history", $param);
// 만약 대상 DB가 $this->db가 아닐 경우, 아래와 같이 manual하게 대상 DB를 선택 할 수 있음 (conf의 DB 이름 기준)
// $query=$this->query("get_price_change_history", $param, 'DB1');
$result['list'] = $query->result_array();

KTK_Model 미 사용 시

쿼리_해석_및_DB호출_결과_수신_2.php
// $data를 이용, get_price_change_history 분석 후 퀴리 실행 (대상 DB 명시 선택)
$query=$this->queryparser->query("get_price_change_history", $data, 'DB1');
$result['list'] = $query->result_array();

공통

위에서 기술한 바와 같이 바로 DB호출이 아닌 해석된 Query문을 String으로 받을 수 있다.

쿼리를_텍스트_구문으로_받아_Manual하게_DB호출.php
// $data를 이용, 기존 로드된 XML의 id='get_price_change_history' SQL을 해석하여 바인딩
$query = $this->queryparser->parse('get_price_change_history', $data);
// 퀴리 실행하여 결과 바인딩
$query = $this->db->query($query);
$result['list'] = $query->result_array();