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 후에 문자열에 조건을 넣으시면 됩니다. |
※ if문 사용 시 주의점.(따옴표 주의) 문자열 비교시 주의점.
<if test="name.equals('kim')"></if> // 정상 작동하지 않음
<if test='name.equals("kim")'></if> // 정상 작동
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 태그
태그 | 설명과 예시 |
<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 태그
태그 | 설명과 예시 |
<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> 와 같다. |
foreach 태그
iBatis의 iterate와 비슷한 태그도 존재한다. 반복 기능
태그 | 설명과 예시 |
<foreach> | 배열 타입의 파라미터를 받을 때 사용한다. 배열이나 리스트의 경우 parameterType="Map" 으로 설정하고 List일 경우 collection="list" 배열일 경우 collection="array" 로 설정. List나 Array의 경우 Mybatis 내부단에서 Map으로 치환을 함. <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