[mybatis] XML 파싱 에러 발생

2025. 1. 2. 22:39Lang/JAVA


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

자바에서 DB 제어를 할때 많이 쓰이는 것중하나가 mybatis이다. xml을 쓸지 그냥 interface mapper로 해결할지는 선택이지만 xml 을 사용할 경우 위와 같은 에러를 볼 수 있다.

 

xml도 html과 유사한 태그형 마크업 언어이기 때문에 sql 쿼리에서 쓰이는 기호들이 xml 파일 형식을 어긋나게 하는 경우가 있는데 이때 저런 에러가 발생한다.

 

주로 <, >  같은 부등호로 조건 연산을 할때 나오는 에러이다.

 

저 부등호가 xml상의 태그로 인식되기 때문에 에러가 발생하는 것이다.

 

이럴 때 해결방법은 주로 2가지가 있다.

 

1. 엔터티 문자 사용

부등호나 다른 특수기호 사용시 xml 마크업 문법으로 인식되는 현상에 대처하기위해 xml자체에서 제공하는 방법이다.

이스케이프 코드와 유사하게 생각하면 될것 같다

 

특수문자 XML 엔터티 설명
< &lt; ( Less Than ) 작다
> &gt; ( Greater Than ) 크다
& &amp; ( Ampersand ) 앰퍼샌드
" &quot ( Double Quote ) 큰 따옴표

 

2. CDATA (Character Data)

xml에서 특수문자를 처리하는 방법 중 하나로 CDATA로 선언한 블록안은 그대로 문자열로 처리하라는 표시이다.

이 방법을 쓰면 위와 같은 표기를 바꾸지 않아도 되서 가독성면에서 더 편해진다.

 

CDATA 섹션을 선언하는 방법은 

 

<![CDATA[

    문자열 내용 

]]>

 

이렇게 하면된다.

 

보기엔 편해 보이지만 뚜렷한 단점이 존재한다.

 

안에 내용을 문자열로 처리하기 때문에 섹션안에서는 xml 문법을 사용할 수 없다.

xml 문법을 기반으로 동작하는 mybatis의 if, when, foreach 등의 문법또한 동작하지 않는다 그래서 이러한 문법을 써야할때는 각 문법 블록안에서 CDATA를 선언해줘야한다.

특수문자의 양이 많지 않고 저런 mybatis 문법을 많이 사용해야하면 오히려 엔터티를 사용하는 편이 가독성이 올라간다고 볼수 있다.