본문 바로가기
JAVA/Error

[XML] org.xml.sax.SAXParseException; 주석에서는 "--" 문자열이 허용되지 않습니다.

by 고 민 2023. 1. 2.
728x90
반응형
org.xml.sax.SAXParseException; lineNumber: 662; columnNumber: 30;
주석에서는 "--" 문자열이 허용되지 않습니다. 

 

발생시점 

Mybatis 쿼리 수정 후 서버를 올릴 때 root-context.xml을 읽어오면서 발생.

 

발생상황

쿼리를 수정 중 후 테스트를 하려고 새로운 이전 쿼리가 감싸져 있는 <select> 태그 전체를 주석처리 했는데,

스프링이 XML을 파싱할때 쿼리 스크립트 group by절에 '--'로 주석처리해놓은 부분에서 오류가 발생한 것으로 보입니다. 

XML주석의 형태 때문인지 주석 내에  '--'를 허용하지 않는 것 같습니다. 

 

<!-- <select id="findReader" parameterType="ReaderVO" resultType="ReaderVO">

/... 상단 쿼리 생략 ..../ 

GROUP BY a.tot_reader_seq		-- a.no
</select>
 -->

 

주석 내부에서 오류가 발생할거라는 생각을 못해서 뒤통수의 얼얼함을 느끼며 SAX에 대해 찾아봤는데, 간단히 요약하자면 다음과 같습니다. 

 

SAX(Simple Api for XML)란? 

XML을 파싱하는 방식 중 하나로 XML문서를 순차적으로 읽어 들이면서 오류를 발생시키는 방식입니다. 

 

SAX방식

1. XML문서를 순차적으로 읽어들이면서 노드가 열리고 닫히는 과정에서 이벤트가 발생한다.

2. XML문서를 메모리에 전부 로딩하고 파싱 하는 것이 아니라서 메모리 사용량이 적고 단순히 읽기만 할 때 속도가 빠름.

3. 발생한 이벤트를 핸들링하여 변수에 저장,활용하는 것이기 때문에 복잡하고, 노드 수정이 어렵다.

4. DOM보다 어렵다.(XML을 파싱하는 또 다른 방식) 

 

명확한 해답은 되지 않았지만 아무래도 파싱과정에서 오류가 발생한 것이기 때문에 SAX가 XML을 한 줄씩 읽고 파싱 한 후 주석된 부분에 대해선 이벤트를 발생시키지 않는 방식으로 되어있는 것 같습니다. 

다음과 같이 변경하니 잘 실행 됩니다. 

<!-- <select id="findReader" parameterType="ReaderVO" resultType="ReaderVO">

/... 상단 쿼리 생략 ..../ 

GROUP BY a.tot_reader_seq		/*a.no*/
</select>
 -->

XML문서에 Mybatis쿼리를 작성할때 되도록이면 주석을 사용하지 않는 것이 좋을 거 같습니다.

만약 사용할 일이 있다면 /**/을 사용하시길 권고드립니다. 

XML 관련 출처 

https://humble.tistory.com/23

 

 

728x90
반응형