본문 바로가기
📌 Back End/└ Spring

[Spring] MyBatis에서 CDATA사용법

by 쫄리_ 2023. 3. 10.
728x90
반응형

쿼리를 작성할때

'<' , '>', '&' 을 사용해야하는 경우가 생기는데

xml 에서 그냥 사용할 경우 태그로 인식하는 경우가 종종 있다.

이럴경우 에러를 뱉어내기 때문에 '태그가 아니라 실제 쿼리에 필요한 코드' 라고 알려줘야 한다.

그때 사용하는 것이 <![CDATA[...]]> 이다.


한마디로

<>(부등호) , &(엔드), ||(오아) 등을 닫는 부등호가 아니라 문자열로 처리하라는 뜻

즉 "XML parser" 를 하지 말자

  • XML에서 파싱할 대상으로 인식하지 않도록 그 구역을 지정해주는 것이 CDATA이다.

XML로 파싱을 원하지 않는 구간의 시작에 <![CDATA[를 붙여주고, 구간의 끝에]]> 를  추가하면 해당 구역이 파싱되지 않도록 설정할 수 있다.


<select id="userList" resultType="UserVO">
   select * from tbl_member where userId < 5;
</select>

"<" 이러한 괄호로 작성한 경우 "에러발생" 한다.

이유는 즉시 XML parser로 인식했으니 XML parser에선 "<" 가 태그의 시작이기 때문입니다.

이렇기 때문에 부등호로 작성하지 않고 ![CDATA[...]]> 문자열로 처리할 수 있도록 해야한다.


 

문법

<![CDATA[
    쿼리 내용
]]>

CDATA 안에 쿼리를 사용하면 쿼리 내용의 괄호나 특수문자를 XML parser로 인식하지 않고 "문자열"로 인식합니다.

<select id="userList" resultType="UserVO">
    <![CDATA[
        select * from tbl_member where userId < 5;
    ]]>
</select>

이렇게 사용하면 SQL 안에 특수문자가 들어가도 문자열로 인식하기 때문에 문제를 해결할 수 있습니다.


 

조건문 중간에 CDATA 사용하는 방법

 

if문

<select id="userList" resultType="UserVO">

   select * from tbl_member

   <if test = "userId != null">
      where userId <![CDATA[<]]>5;
   </if>

</select>
 

choose문

<select id="userList" resultType="UserVO">
   <![CDATA[
        select * from tbl_member where 1=1 ]]>
   <choose>
        <when test='userId != null and userAddress == "ko"'
            <![CDATA[
                 userAge > 15
            ]]>
        </when>
        <otherwise>
             <![CDATA[
                  userAge < 15
             ]]>
        </otherwise>
    </choose>
</select>
 

그 외 이러한 부분도 가능함

<select id="userList" resultType="UserVO">
    select *
    from tbl_member
    where userId <![CDATA[<]]>;
</select>
 

주의할 점

<![CDATA[...]]> 사용하는 경우 동적 쿼리문을 사용할 수 없기 때문에 쿼리문 전체가 아닌 특수문자 포함된 코드에만 <![CDATA[...]]> 사용해야 합니다.

728x90
반응형