[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기)

2022-03-01

CDATA ( <![CDATA[..]]> )

  • 개념

쿼리를 작성할 때, ‘<’, ‘>’, ‘&’를 사용해야하는 경우가 생기는데 xml에서 그냥 사용할 경우 태그로 인식하는 경우가 종종 있다.. 이럴 경우 에러를 뱉어내기 때문에 ‘태그가 아니라 실제 쿼리에 필요한 코드’라고 알려줘야 한다. 그때 사용하는 것이 <![CDATA[…]]> 이다.

한 마디로 <>(부등호),&(앤드),   (오아) 등을 닫는 부등호가 아니라 문자열로 처리하라는 뜻입니다.

어렵게 말하자면 “XML parser”를 하지 말아라 이겁니다.

66321489752153.png

사진을 보시면 “<” 괄호가 연녹색이네요? 엥? 에러가 떴네요?

예 맞습니다. XML parser로 인식했으니 XML parser에선 “<”가 태그의 시작이거든요

다른 설정들도 <내용> 이 포맷이잖아요

이해되셨지요?

그럼 사용해봅시다.

  • 문법
<![CDATA[

쿼리 내용

]]>

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

“문자열”로 인식한다 이말입니다. 문자열로!

  • 다양한 예시

전체 쿼리 CDATA 사용

<select id="getUserList" resultMap="UserVO">
    <![CDATA[
    select *
    from user
    where id > 3
    ]]>
</select>

조건 문 중간에 CDATA 사용

  • if 문
<select id="getUser" resultType="UserVO">
select * from user
<if test="id != null">
where id  <![CDATA[<]]> 3;
</if>
</select>
choose 
<select id="getUser" resultMap="UserVO">
    <![CDATA[
    select *
      from user
     where  1=1
    ]]>
    <choose>
        <when test='id != null and user_type =="1"'>
            <![CDATA[
                salary > 100
            ]]>
        </when>
        <otherwise>
            <![CDATA[
                salary < 100
            ]]>
        </otherwise>
    </choose>
</select>

이런 것도가능

<select id="getUser" resultType="UserVO">
SELECT *
FROM user
WHERE id <![CDATA[<]]> ;
</select>

출처: https://java119.tistory.com/70?category=824525