728x90
개요
Mybatis로 작성한 쿼리문에서 발생한 에러이다. 내용을 해석해보면 다음과 같다.
SAXParseException : 내용은 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다.
아래는 SAXParseException 에러가 발생한 쿼리 예시이다. 쿼리로서만 보면 문제 있어 보이지 않는다. 그럼 어떤게 문제였을까?
SELECT NAME
FROM USERS
GROUP BY NAME
HAVING SUM(CASE WHEN SEX = 'M' THEN 1 ELSE 0 END) < 1;
개발 환경
- Java 8
- Spring 2.x
- Maven
- Oracle
- Mybatis
- IntelliJ
원인
우선 SAX를 알아보자 SAX는 "Simple API for XML"의 약자로 이벤트 기반 XML 파싱해주는 기능을 한다.
SAXParseException 예외는 SAX에서 XML파일을 파싱하는 과정에서 발생하는 에러이다.XML 문서의 구조가 잘못되었거나, 유효하지 않은 XML 형식일 때 발생한다. 예를 들어, 태그가 제대로 닫히지 않았을 때 발생할 수 있다.
특히 Mybatis를 이 에러가 많이 발생하게 되는데, 바로 쿼리 문에서 부등호를 사용할 때이다. XML에서 부등호는 (<, >) 태그로 인식하기 때문에 내 쿼리에 있던 부등호가 문제가 되었던 것이다.
SELECT NAME
FROM USERS
GROUP BY NAME
HAVING SUM(CASE WHEN SEX = 'M' THEN 1 ELSE 0 END) < 1; -- 여기 부등호가 문제였다.
해결
이럴 때 CDATA를 사용하면된다.
CDATA는 Character DATA(문자형 데이터)로 XML에서 특정 문자를 파싱하지 않고 문자열 자체로 출력해준다.
아래 예시처럼 CDATA 문법 안에 파싱을 원하지 않는 쿼리문을 넣어주면 된다.
<![CDATA[ 쿼리 ]]>
<![CDATA[
SELECT NAME
FROM USERS
GROUP BY NAME
HAVING SUM(CASE WHEN SEX = 'M' THEN 1 ELSE 0 END) < 1;
]]>
CDATA 안에 포함시켜주니 에러 없이 해당 프로세스가 잘 실행되었다!
참조
728x90
'Java' 카테고리의 다른 글
Java - 자바 가비지 컬렉션(Garbage Collection)을 알아보자 (1) | 2024.11.09 |
---|---|
Java - JVM 구조와 동작 방식 (1) | 2024.11.03 |
Java - File로 파일 목록 이름 조회하기 (1) | 2024.01.25 |
Java - @JasonCreator로 DTO에서 유연하게 Enum Type 받기 (0) | 2023.04.26 |
Java - 커스텀 애너테이션으로 유효성 검사하기 (0) | 2023.04.22 |