본문 바로가기
공부방/Java

XML 쿼리에서 비교연산자 에러 해결( <![CDATA[ > ]]> )

by SmartCow 2024. 5. 22.

JAVA를 이용해서 일을 하는중에 컴파일을 하는데 알 수 없는 오류가 발생했다.
(해결후에 스샷을 안뜬걸 생각해냄... 하하...)

The content of elements must consist of well-formed character data or markup.

대략 이런 오류 메세지였던거 같다

<select id="testData" resultMap="resultMap">
SELECT A, B, C, D
  FROM TEST
WHERE A > 0
     AND B < 0
</select>

대략 이런 쿼리를 보면 그냥 쿼리만 딱 봤을땐 이상할게 없다

이게 왜?? 머가 문제인가??
DB툴에서 돌려봐도 오류 없이 조회가 잘된다.

 

결국 이러저리 찾아보다 발견된 이 쿼리가 오류가 난 이유..

해결

결론은  <![CDATA[  ]]> 이걸 사용하지 않아서 발생한 문제다.

스프링 프로젝트에서는 xml에 쿼리문을 작성할 때
<>, <, > 등의 비교연산자나 부등호를 사용하면 해당 문자를 원래 용도로 인식하는게 아니라
태그로 인식해서 오류가 발생된다.

<select id="testData" resultMap="resultMap">
SELECT A, B, C, D
  FROM TEST
WHERE A <![CDATA[ > ]]> 0
     AND B <![CDATA[ < ]]>  0
</select>

이런식으로 비교연산자나 부등호 앞뒤로 <![CDATA[  ]]> 이걸 넣어야 오류없이 제대로 쿼리를 인식함.

<![CDATA[ ]]> 쓰는 방법으로는 쿼리 전체를 감싸거나 부등호나 비교연산자 부분만 감싸던가 하면 된다.

1. 전체를 감싸기

<select id="testData" resultMap="resultMap">
<![CDATA[ SELECT A, B, C, D
  FROM TEST
WHERE A  >  0
     AND B  <   0 ]]>
</select>

2. 필요부분만 감싸기

<select id="testData" resultMap="resultMap">
<![CDATA[ SELECT A, B, C, D
  FROM TEST
WHERE A  >  0
     AND B  <   0 ]]>
</select>

3. 감쌀때 예외로 둬야하는 부분

<if test="testGubun != null and testGubun != ''">
  AND C <![CDATA[ > ]]> 1
</if>

이처럼 쿼리에 조건문이 포함될 경우에는 <![CDATA[ ]]> 안에 넣으면 조건문을 인식하지 못한다.
고로 조건(if, case등)을 사용할때는 <![CDATA[ ]]>의 바깥에 사용하도록 한다.

'공부방 > Java' 카테고리의 다른 글

Autowired 어노테이션  (0) 2022.11.15
web.xml 생성  (0) 2022.11.05
Maven없이 JAVA 프로젝트 만들기  (0) 2022.11.05
Tomcat server.xml 분석  (0) 2022.03.14
favicon.ico 에러  (0) 2021.03.01