본문 바로가기

프로그래밍

Mybatis XML SAXParseException Exception 해결하기




Caused by: org.xml.sax.SAXParseException; 요소 콘텐츠는 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다.

이런 오류를 보신적이 있으신가요?
Mybatis사용중에 발생한 오류인데요.
많이 써왔지만 처음본 경우라 다소 당황스러웠습니다.

질문에 답이 있다고 문자 데이터 또는 마크업 구성이 잘못되었다는 뜻이라 생각하고 요리조리 알아봤습니다.
우선 오류가 난 쿼리 부분을 조금 보여드리자면 아래와 같습니다.


문법상으로 전혀 문제가 없고 잘 돌아가는 쿼리입니다. 
JOIN을 위해서 B 테이블의 col_10이 STYLE이 아니고 
A 테이블의 col_0과 같은 값을 B테이블의 col_0이 갖고 있는 로우들만 불러옵니다.

잘되는 쿼리는 이미 쿼리를 테스트해서 맞는데 무엇이 문제일까요?
원인은 바로 '같지 않다'를 의미하는 <>에 있었습니다.

<> 같지 않다의 의미를 가진 이 꺽쇠가 오류의 원인인 이유는 XML태그와 부등호가 같기 때문에 파싱을 하면서
이를 혼동하여 발생하는 것입니다. 
때문에 따로 표기를 해야되는데 아래와 같은 형식으로 하시면 됩니다.


<![CDATA[]]> 절 안에 있는 내용은 전부 Parser에서 문자데이터로 인식하기 때문에 꺽쇠로 표기한 것을
parsing의 대상으로 인식하지 않는 것 때문에 이러한 방식으로 기술하는 것입니다.

사실 이 방법보다는 아에 꺽쇠를 안쓰는 비교연산자를 쓰는 것이 더 낫지 않은가 하는 생각도 듭니다.
하지만 대체할만 한 연산자가 별로 없는게 함정이지요..


<> 이 연산자를 대체할 것은 != 이것인데.. 다른 것은 더 알아봐야 할 것 같습니다.

이렇게 되면 비교연산자를 쓸때 xml의 parser의 눈치를 보게되는 것 때문에 아에 CDATA로 쿼리 전체를 감싸는 방법도 있습니다.



어떤 방법을 쓰시던 결과가 정상적으로 나오고 손에 익는다면 최고의 방법이겠지요?