WEB/Spring

[MyBatis] 자주 실수하는 CDATA 사용법 자세히 알아보기

MoonSta 2023. 6. 17. 12:21

 Mybatis에서 쿼리를 작성하고 빌드하는 경우에 자주 XML PARSER 관련 에러를 자주 마주하게 됩니다. 막상 확인해 보면 잘못된 CDATA 사용으로 일어나는 문제이기 때문에 이번 포스팅을 통해 정확한 사용법에 대하여 알아보도록 하겠습니다. 

 

📌CDATA를 사용해야 하는 경우 

기호 XML 엔티티
< &lt;
> &gt;
& &amp;
" &quot;

Mybatis에서는 쿼리를 파싱 하는 과정에서 위의 기호들을 XML 엔티티로 모두 파싱을 한다.

 

 

<select id="retrieve" resultMap = "commonResultMap">
  SELECT *
    FROM MEMBER
   WHERE AGE < 10
</select>

 위의 쿼리를 작성 후 빌드를 하면 에러가 발생합니다. 그 이유는 조건 절에 있는 '<'이 부분이 xml을 파싱 하는 과정에서 닫힘 태그로 인식되기 때문입니다. 따라서 이러한 경우에 XML 파싱이 필요하지 않은 부분에 CDATA로 감싸 문자열로 치환시켜 에러를 해결할 수 있습니다. 

 

📌CDATA의 사용법 

<select id="retrieve" resultMap = "commonResultMap">
  SELECT *
    FROM MEMBER
   WHERE AGE <![CDATA[<]]> 10
</select>

 

 XML에서 파싱을 할 시작점이 '<'이기 때문에 이전에 작성했던 쿼리의 조건절에 있던 '<' 부등호를 파싱의 시작점으로 인식하였고, 그 결과 에러를 발생시켰다. 쿼리를 작성하는 경우에 '<', '>' '&'에 해당하는 기호를 자주 사용하게 되는데 이러한 기호들을 파싱 하는 과정에서 온전히 문자열로 인식시켜야 한다. 인식시켜 주는 방법이 CDATA로 감싸는 방법이다.

 

 

📌CDATA 사용 시 주의 사항

 xml에서 sqlMap이나 Mapper를 사용하는 경우 CDATA로 쿼리를 모두 감싸게 되면 해당 쿼리는 동적 쿼리로서 사용할 수 없다. 이러한 상황에서 동적 쿼리를 사용하고 싶은 경우에는 XML 파싱을 원치 않은 특정 기호에만 CDATA로 감싸게 되면 동적 쿼리를 사용할 수 있다.