Mybatis에서 쿼리를 작성하고 빌드하는 경우에 자주 XML PARSER 관련 에러를 자주 마주하게 됩니다. 막상 확인해 보면 잘못된 CDATA 사용으로 일어나는 문제이기 때문에 이번 포스팅을 통해 정확한 사용법에 대하여 알아보도록 하겠습니다.
📌CDATA를 사용해야 하는 경우
기호 | XML 엔티티 |
< | < |
> | > |
& | & |
" | " |
Mybatis에서는 쿼리를 파싱 하는 과정에서 위의 기호들을 XML 엔티티로 모두 파싱을 한다.
<select id="retrieve" resultMap = "commonResultMap">
SELECT *
FROM MEMBER
WHERE AGE < 10
</select>
위의 쿼리를 작성 후 빌드를 하면 에러가 발생합니다. 그 이유는 조건 절에 있는 '<'이 부분이 xml을 파싱 하는 과정에서 닫힘 태그로 인식되기 때문입니다. 따라서 이러한 경우에 XML 파싱이 필요하지 않은 부분에 CDATA로 감싸 문자열로 치환시켜 에러를 해결할 수 있습니다.
📌CDATA의 사용법
<select id="retrieve" resultMap = "commonResultMap">
SELECT *
FROM MEMBER
WHERE AGE <![CDATA[<]]> 10
</select>
XML에서 파싱을 할 시작점이 '<'이기 때문에 이전에 작성했던 쿼리의 조건절에 있던 '<' 부등호를 파싱의 시작점으로 인식하였고, 그 결과 에러를 발생시켰다. 쿼리를 작성하는 경우에 '<', '>' '&'에 해당하는 기호를 자주 사용하게 되는데 이러한 기호들을 파싱 하는 과정에서 온전히 문자열로 인식시켜야 한다. 인식시켜 주는 방법이 CDATA로 감싸는 방법이다.
📌CDATA 사용 시 주의 사항
xml에서 sqlMap이나 Mapper를 사용하는 경우 CDATA로 쿼리를 모두 감싸게 되면 해당 쿼리는 동적 쿼리로서 사용할 수 없다. 이러한 상황에서 동적 쿼리를 사용하고 싶은 경우에는 XML 파싱을 원치 않은 특정 기호에만 CDATA로 감싸게 되면 동적 쿼리를 사용할 수 있다.
'WEB > Spring' 카테고리의 다른 글
[Spring]기본적인 어노테이션(Annotation)을 알아보자 (2) | 2023.07.21 |
---|---|
[Spring]문자열을 다루는 유용한 라이브러리(StringUtils) 알아보기_1 (8) | 2023.07.16 |
[Java]stream 살펴보기_(1)등장 배경, 컬렉션과의 차이 (4) | 2023.05.21 |
[Spring]Getter 그리고 Setter 생성하고 사용하기 (2) | 2023.05.16 |
[Spring]스프링 배치(Batch)란? (8) | 2023.02.20 |