본문 바로가기

Work. 2018/Pjt. H 스마트연수원

iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL

[출처] 알짜배기 프로그래머 블로그


iBatis, myBatis 동적 태그 비교 정리 Dynamic SQL

 

iBatis 의 업그레이드 버젼이 myBatis 라고 생각 하시면 됩니다.

 

iBatis 가 Apache 에서 google로 넘어가면서 명칭이 변경된 것이죠.

 

설정이나 기타 차이점에 대해서는 아래의 Link를 참조하시고,

 

Link : 전자정부프레임워크 iBatis, MyBatis 설정 방식 차이, 비교

 

이번 포스팅에서는 이 둘의 동적 태그를 비교해서 알아보도록 하겠습니다.

 

우선 iBatis 에서 사용되는 기본 동적 태그(Binary Conditional Tag)는 아래와 같습니다.

여기서 사용되는 속성에는

 

prepend - 태그 조건에 맞아 실행될 sql문에 선행하여 붙을 속성

property - 매개변수 명

compareProperty - 비교할 다른 매개변수명

compareValue - 비교대상이 될 값

 

이 있습니다.

<iBatis 동적 태그>

 

태그

설명과 예시

<isEqual> 

 property의 값이 같을때만 태그내 쿼리를 실행합니다.

WHERE 1=1

 <isEqual prepend="AND" property="useYn" compareValue="Y">

        EQUIP_TYPE = 1

</isEqual>

 

useYn 이 Y 일때만 EQUIP_TYPE =1 조건을 실행합니다.

 <isNotEqual>

  property의 값이 같지 않을 때만 태그내 쿼리를 실행합니다.

WHERE 1=1

<isNotEqul prepend="AND" property="useYn" compareValue="N">

            EQUIP_TYPE = 1

</isNotEqual>

 

useYn 이 N이 아닐 때만 EQUIP_TYPE=1 조건을 실행합니다.

 

 <isGreaterThan>

property의 값이 비교값보다 클경우 쿼리를 실행합니다.

WHERE 1=1

<isGreaterThan prepend="AND" property="age" compareValue="19">

             JOIN_YN = 'Y'

</isGreaterThan>

 

age 값이 19 보다 클경우 JOIN_YN='Y' 조건을 실행합니다.

 <isGreaterEqual>

property의 값이 비교값보다 같거나 클경우 쿼리를 실행합니다.

WHERE 1=1

<isGreaterEqual prepend="AND" property="age" compareValue="18">

              JOIN_YN = 'Y'

</isGreaterEqual>

 

age 값이 18 이거나 이보다 클경우 JOIN_YN='Y' 조건을 실행합니다.

 <isLessEqual>

property의 값이 비교값보다 작거나 같을 경우 쿼리를 실행합니다.

WHERE 1=1

<isLessEqual prepend="AND" property="age" compareValue="18">

            JOIN_YN = 'N'

</isLessEqual>

 

다음은 단일 조건 태그 입니다. (아래부터는 설명을 제외하겠습니다. 위와 비슷하니..)

 

 태그

설명 

 <isPropertyAvailable>

 property값이 유효할 경우 쿼리를 실행합니다.

 <isNotPropertyAvailable>

 property값이 유효하지 않을 경우 쿼리를 실행합니다.

 <isNull>

 property값이 null일 경우 쿼리를 실행합니다.

<isNotNull>

 property값이 null이 아닐 경우 쿼리를 실행합니다.

 <isEmpty>

 property값이 비어있을경우 쿼리를 실행합니다.

 <isNotEmpty>

 property값이 비어있지 않을 경우 쿼리를 실행합니다.

 

다음은 파라메터 조건 태그 입니다.

 

 태그

설명과 예시

 <isParameterPresent>

 파라메터가 있을 경우 쿼리를 실행합니다.

<isParameterPresent prepend="WHERE"> 

          1=1

</isParameterPresent>

 

파라메터값이 넘어왔을 경우에만 WHERE 조건 붙음

 <isNotParameterPresent>

 파라메터값이 없을 경우 쿼리를 실행합니다.

WHERE 1=1

<isNotParameterPresent prepend="AND">

         TYPE = 'DEFAULT'

<isNotParameterPresent>

 

파라메터값이 없을 경우에만 TYPE = 'DEFAULT' 쿼리 실행

 

 

다음은 Iterate 태그 입니다.

파라메터로 배열을 넘겨 IN 쿼리문을 사용할 때 유용합니다.

 

 태그

설명과 예시

 <iterate>

배열 타입의 파라메터를 받을 때 활용합니다.

WHERE 1=1

<isNotEmpty prepend="AND" property="empIdArray">

       EMP_ID IN <iterate open="(" close=")" conjunction="," property="empIdArray">#empIdArray[]#</iterate>

</isNotEmpty>

 

배열의 값을 빼내어 콤마로 구분하여 괄호 '(' , ')' 내에 넣게 되죠.

ex) ('111', '222', 333', '444') 

 

마지막으로 dynamic 태그 입니다.

 

 태그

설명과 에시

 <dynamic>

 하위 태그에 일치되는 내용이 존재할 경우 where절을 붙인다.

가장 처음 일치요소의 prepend="AND" 는 생략된다.

<dynamic prepend="WHERE">

        <isEqual prepend="AND" property="empId" comapareValue="123">

                    VACATION = 'TRUE'

        </isEqual>

</dynamic>

 

empId 파라메터 값 123이라면 <isEqual>태그의 prepend는 생략되고

WHERE 절이 붙어 WHERE VACATION = 'TRUE' 쿼리가 실행된다.

 

이제 iBatis의 동적태그는 모두 알아보았구요.

이제 myBatis의 동적 태그에 대해서 알아보도록 하겠습니다.

 

 

 

 

<myBatis 동적 태그>

 

if문 - iBatis 의 isEqual, isNotEqaul, isNull, isNotNull, isEmpty, isNotEmpty 를 하나로

 

 태그

설명과 예시

 <if>

일반 개발 언어의 if문으로 보시면 됩니다.

WHERE 1=1

<if test="empId != null">

       AND EMP_ID = #{empId}

</if>

 

if test 후에 문자열에 조건을 넣으시면 됩니다.

 

choose, when otherwise - oracle case문 과 같이 케이스에 따라 조건이 달라질 때

 

 태그

설명과 예시

 <choose>, <when>, <otherwise>

 Oracle의 case 문과 비슷하다고 보시면 됩니다.

WHERE 1=1

<choose>

   <when test = "searchCondition == 'title'">

       AND TITLE LIKE #{title}

   </when>

   <when test = "searchCondition == 'content'">

       AND CONTENT LIKE #{content}

   </when>

   <otherwise>

       AND DEL_YN = 'N'

   </otherwise>

 

파라메터

searchCondition이 title 이면 AND TITLE LIKE #{title} 을

searchCondition이 content이면 AND CONTENT LIKE #{content} 를

아니면 AND DEL_YN = 'N' 을 조회한다.

 

 

 태그

설명과 예시

 <where>, <trim>

iBatis의  dynamic과 같이 조건에 따라 where절을 추가 할때 사용

  SELECT COUNT(*)
    FROM MST_USER
    <trim prefix="WHERE" prefixOverrides="AND|OR">
         <if test="id != null">
               AND USER_ID = #{id}
         </if>
         <if test="pw != null">
               AND USER_PW = #{pw}
         </if>
     </trim>

 

trim태그를 위와 같이 사용하면 맨 첫번째 AND나 OR을 WHERE로 바꾸게 된다.

 

 

 태그

설명과 예시 

 <set>

동적으로 update 구문을 만들때 사용한다.

UPDATE MST_USER

 

   <set>

       <if test="email != null">EMAIL = #{email},</if> 

       <if test="address != null">ADDRESS = #{address},</if>

       <if test="phone != null">PHONE = #{phone},</if>

    </set> 

WHERE USER_ID = #{id}

 

동적으로 set 키워드를 붙히고 불필요한 콤마를 제거한다.

<trim prefix="SET" suffixOverrides=",">

<trim>

와 같다. 

 

iBatis의 iterate와 비슷한 태그도 존재한다.

 

태그 

설명과 예시 

 <foreach>

 배열 타입의 파라미터를 받을 때 사용한다.

<trim prefix="WHERE" prefixOverrides="AND|OR">

<if test="empIdArray != null">

      AND EMP_ID IN <foreach item="empIdArray" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach>

</if>

 

배열의 값을 빼내어 콤마로 구분하여 괄호 '(' , ')' 내에 넣게 되죠.

ex) ('111', '222', 333', '444') 

collection : 파라메터로 받은 배열변수의 명칭

item : collection의 alias

 

bind - 변수를 만드는 태그

 

태그 

설명과 예시 

 <bind>

변수를 생성한다.

<bind name="searchKeyword" value="'%'+title+'%'"/>

SELECT *

  FROM BOARD

 WHERE TITLE LIKE #{searchKeyword}

 

title 파라메터를 받아 searchKeyword라는 변수에 저장하고

이를 쿼리에서 활용할 수 있다.

 

 

iBatis와 myBatis에서 사용하는 동적 태그들에 대해서 알아보았는데요.

비슷한듯 하면서도 약간의 차이가 있네요.

 

동적 태그를 잘 활용하면 보다 다이나믹한 쿼리를 생성할 수 있습니다.

 

iBatis 참조 : https://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html

myBatis 참조 : http://www.mybatis.org/mybatis-3/ko/index.html