안녕하세요.
오늘은 Mybatis의 문법 에러에 대해 포스팅을 하려고 합니다.
에러 내용은 '요소 콘텐츠는 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다'이며, xml을 작성하다 보면 sql에 부등호를 넣어야 하는 경우에 발생하는 에러입니다. 그런데 sql문을 작성하다 보면 비교 조건을 넣을 때 부등호를 넣어야 하는데 위와 같은 에러가 왜 발생하는 걸까요? 부등호를 넣었을 때 왜 에러가 발생하는 건지 간단한 예제를 통해서 알아보도록 하겠습니다.
1. 에러 발생 예시
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.system.model.mapper.TestMapper">
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultType="map">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
WHERE Age < #{age}
</select>
</mapper>
위의 예시 코드를 보게 되면 테이블 목록을 호출하는 간단한 예제입니다. 쿼리에서 비교문이 있는 WHERE절을 추가하였고, 대충 보면 크게 문제가 될 것 같진 않습니다. 하지만 위의 예제를 실행하게 되면 에러가 발생합니다. 위의 예제 코드를 실행한 결과를 먼저 보도록 하겠습니다.
실행 결과
위의 실행 결과를 보게 되면 '요소 콘텐츠는 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다'라는 문구의 에러가 발생하였습니다. 위와 같은 에러가 발생하는 이유는 조건절에서 부등호를 사용했기 때문에 발생하였습니다. 하지만 조건절에서 부등호를 사용하지 않으면 비교를 할 수 없는데, 이럴 땐 어떻게 해야 할까요?
Mybatis에서 부등호를 사용하려면 <![CDATA [ ]]> 라는 문법을 사용하면 됩니다. <![CDATA[ ]]>를 사용하는 방법은 간단합니다. 부등호를 사용해야 하는 부분에서 <![CDATA[ ]]>를 감싸서 사용을 하면 됩니다.
<![CDATA[ ]]> 사용 방법
< <![CDATA[ < ]]>
> <![CDATA[ > ]]>
<> <![CDATA[ <> ]]>
부등호 | CDATA 처리한 부등호 |
< | <![CDATA[ < ]]> |
> | <![CDATA[ > ]]> |
<> | <![CDATA[ <> ]]> |
<= | <![CDATA[ <= ]]> |
>= | <![CDATA[ >= ]]> |
CDATA란
CDATA는 character data를 줄임말로 문자 데이터를 의미합니다. 보통 마크업 언어에서 사용하는 문법이며, 마크업 언어에서 일반적으로 마크업으로 해석이 되는 데이터를 일반 데이터로 해석할 수 있도록 처리할 때 사용합니다.
그러면 CDATA를 사용하여 처리한 예제 코드를 보도록 하겠습니다.
2. CDATA 사용 예시
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.system.model.mapper.TestMapper">
<!-- Member 목록 조회 mapper -->
<select id="selectMemberList" resultType="map">
SELECT
Idx ,
Name ,
EmpNo ,
Age
FROM Member
WHERE Age <![CDATA[ < ]]> #{age}
</select>
</mapper>
CDATA를 적용한 예시 코드입니다. 위의 예제와 같이 WHERE절을 보게 되면 부등호를 사용하는 부분에 <![CDATA[ < ]]> 이렇게 감싸줬습니다. xml에서는 태그 요소에 부등호가 들어가기 때문에 마크업 언어에서 일반적으로 부등호는 예약된 기호라고 이해하면 됩니다. 그렇기 때문에 부등호 기호들은 모두 마크업의 태그 요소라고 인식이 되어 에러가 발생하게 되었습니다. 그래서 위와 같이 CDATA 처리를 해주게 되면 CDATA 요소 안의 문자는 모두 마크업과 상관없이 모두 일반 문자로 처리가 됩니다.
추가로 위와 같이 부등호 부분만 CDATA를 사용하여 부등호를 처리해도 되고, sql 전체를 감싸도록 처리하는 경우도 있습니다. 개인적으로는 전자를 선호하며, 사용하는 방법은 개인차이기 때문에 원하는 방법을 선택하여 사용하면 됩니다.
실행 결과
실행 결과는 에러가 나지 않고 정상적으로 결과가 출력된 모습입니다.
마무리
에러 원인
xml 내에서 쿼리를 작성할 때 비교문에 사용되는 부등호가 들어가게 되면 마크업 언어로 해석이 되어 에러가 발생
해결 방안
마크업 언어로 해석되는 부등호는 CDATA 처리를 하여 일반 문자로 인식하도록 함
예시 : <![CDATA[ < ]]>
오늘은 이렇게 Mybatis에서 발생하는 '요소 콘텐츠는 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다' 에러 내용에 대해 정리해 봤습니다. Mybatis는 xml 기반이며, 마크업 언어라는 것을 알고 있으면서도 오늘 정리한 내용처럼 자주 실수를 하곤 합니다. 추가로 CDATA를 사용하여 간단하게 처리할 수 있는 방법도 정리해 봤으며, 어떤 언어를 사용할 때에는 그 언어의 예약된 기호, 정규식 기호 등을 정리해 두는 것이 시간을 절약하는 길이라고 생각합니다.
간단한 해결책으로 해결할 수 있었던 에러 내용이었으며, Mybatis는 오늘의 내용처럼 생각보다 간단하게 처리되는 에러가 많습니다. 그럼 다음에도 계속해서 유사한 에러들을 가지고 정리하는 시간을 가져보도록 하겠습니다. :)
그럼 오늘도 저의 작고 소중한 글을 읽어주셔서 감사합니다!

'Java > Mybatis' 카테고리의 다른 글
[Mybatis] 마이바티스 foreach를 이용하여 IN절 처리하기 (0) | 2023.07.20 |
---|---|
[Mybatis] 마이바티스 컬럼 자동 매핑하기 (auto mapping) (0) | 2023.02.21 |
[Mybatis] 마이바티스 동적 쿼리 trim 사용하기 (0) | 2023.02.20 |
[Mybatis] 마이바티스 where 태그 사용하기 (0) | 2023.02.18 |
[Mybatis] 마이바티스 sql과 include 사용하기 (0) | 2023.02.17 |