(MyBatis) <![CDATA[ ]]>, CDATA 사용 이유 정리
(MyBatis) CDATA란 무엇인지, 왜 사용하는지
해당 포스팅은 MyBatis에서 사용되는 'CDATA'는 무엇인지, 또 왜 사용하는지 정리한 내용입니다.
XML이란?
CDATA에 대해서 살펴보기 전에 CDATA가 사용되는 'XML'에 대해 간략하게 살펴보겠습니다.
XML이란 'eXtensible Markup Language'의 줄임말이며, 뜻 그대로 확장 가능한 마크업 언어입니다.
또 다른 마크업 언어인 HTML이 웹 페이지를 구성하기 위해 사용되는 반면, XML은 저장되는 데이터의 구조를 기술하기 위한 언어로 데이터를 저장하고 전달하기 위한 목적으로 만들어졌는데요.
XML 태그의 경우 HTML 태그처럼 미리 정의되어 있지 않고, 데이터를 설명하기 위한 태그를 사용자가 직접 정의할 수 있다는 특징이 있습니다.
CDATA란? CDATA 사용 이유?
'CDATA'란 Character Data(문자형 데이터)를 의미하며, <![CDATA[ ... ]]> 구문 안의 데이터는 XML Parser에 의해 해석되지 않고 문자열 그대로 처리됩니다.
<!-- SAXParseException 발생 -->
<select id="cdataExample" resultType="map">
SELECT * FROM student WHERE grade < 4
</select>
예를 들어 설명하자면, MyBatis에서 위 예시와 같은 SQL 쿼리를 실행하게 되는 경우 XML Parser에 의해 WHERE 조건 절의 부등호 '<'가 태그의 시작점으로 인식되어 아래와 같은 'SAXParserException'이 발생하는데요.
Caused by: org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
<!-- 부등호가 사용되는 부분에만 CDATA 처리 -->
<select id="cdataExample" resultType="map">
SELECT * FROM student WHERE grade <![CDATA[ < ]]> 4
</select>
<!-- 전체 쿼리에 대해 CDATA 처리 -->
<select id="test" resultType="map">
<![CDATA[
SELECT * FROM user WHERE idx < 4
]]>
</select>
이러한 경우 다음과 같이 <![CDATA[ ... ]]> 구문을 사용하여 해당 구문 안의 내용이 XML Parser에 의해 해석되지 않고 문자열 그대로 처리되도록 함으로써 쿼리에서 오류가 발생하지 않도록 할 수 있습니다.
***
'CDATA'를 사용하지 않고 해당 문제를 처리하는 방법으로는 '<', '>', '&'를 직접 사용하는 대신 '<', '>', '&'와 같은 간접 표현식을 사용하는 방법이 있지만 사용하기 불편하다는 점과 가독성 때문에 거의 사용되지 않습니다.