( error ) myBatis XML CDATA 에러

ZZOOO

·

2021. 6. 2. 20:59

안녕하세요 오늘은 myBatis를 사용하면서 간혹 발생할 수 있는 문법 오류에 대해서 다뤄보겠습니다.

 

간단하니 부담 갖지 마시고 잘 해결하셨으면 좋겠습니다.


들어가기에 앞서 .. 

 

myBatis XML 특징 & 장점

 

  • 사용하기 간편한 Persistent framework 이다

- Persistence Framework는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다.

( 출처 - 위키백과 )

 

  • 수동적인 파라미터 설정과 mapping 구문을 제거할 수 있다.
  • SQL문과 프로그래밍 코드를 분리하여 소스 정리와 유지보수가 더 편리해진다.
  • JDBC에서 제공하는 기능 대부분을 MyBatis에서 제공한다.

 

간단하게 이 정도의 특징과 장점이 있습니다. 본인의 개발 목적에 맞게 적절히 사용하시면 되겠습니다.

무분별한 라이브러리 사용은 자칫 .. 대형사고로 이어질 수 있습니다.


구현 목표

 

본인이 구현하고자 하는 기능은 다음과 같습니다.

 

2021-05-01 ~ 2021-06-01 기간 사이에 발생한 라이선스 총합 개수를 Type 별로 나타낸다. 

 

음 .. 이렇게 말씀드리면 직관적이지 않아 이해가 안 되실 수 있습니다.

 

쉽게 설명하자면 다음과 같습니다.

 

지난주부터 오늘까지 철수랑 영희랑 민수 세 명이 각각 밥을 몇 끼 먹었는지 말해줘 ~

 

그렇다면 다음과 같은 결과를 원하겠죠 ? 

 

철수 - 20끼 / 영희 - 15끼 / 민수 - 42끼

 

 


구현 쿼리

 

SELECT
	IFNULL(SUM(CASE LICENSE_TYPE WHEN 1 THEN 1 ELSE 0 END), 0 ) AS type1,
	IFNULL(SUM(CASE LICENSE_TYPE WHEN 2 THEN 1 ELSE 0 END), 0 ) AS type2,
	IFNULL(SUM(CASE LICENSE_TYPE WHEN 3 THEN 1 ELSE 0 END), 0 ) AS type3
FROM license_state_history_tbl
WHERE 등록 날짜 > STR_TO_DATE(#{start_date}, '%Y-%m-%d %H:%i:%S')
AND 등록 날짜 < STR_TO_DATE(#{끝 날짜},'%Y-%m-%d %H:%i:%S') AND 번호 = #{번호}

 

( 예시를 들어 작성해보았습니다 )

 


에러 발생

 

 

 

다음과 같은 경고가 뜨며 에러 표시가 발생했습니다.


에러 발생 원인 

 

myBatis xml 소스를 작성해보신 분들은 아시겠지만 구문 형식이 다음과 같습니다.

 

<select id = "getAllStudentName" resultType = "StudentENTITY">
	SELECT sit.name FROM student_info_tbl sit;
</select>

 

이런 형태를 지닌 쿼리문으로 이뤄져 있는 것이 myBatis xml 파일입니다.

 

헌데 좀 전에 제가 구현하고자 하는 조건이 어떤 것이었죠? 

 

2021-04-01 ~ 2021-05-01 사이에 ....

 

네 그렇습니다. 범위를 설정해주어야 합니다. 내부 table의 구조가 between 함수를 사용할 수 없는 구조라

사용하지 못하고 ">" , "<" 와 같은 부등호로 값을 추출해야 하는 상황이었습니다.

 

하지만 xml에서 태그의 시작을 "<" 로 열고 "/>" 로 닫다 보니 

범위를 나타내기 위한 목적으로 "<" 나 ">"를 사용했을 때 오류가 발생하는 것입니다.

 

그래서 해결할 수 있는 문법이 다음과 같습니다.

 

SELECT 추출값 
FROM 추출하고자하는 테이블명 
WHERE 등록 날짜 <![CDATA[ > ]]> STR_TO_DATE(#{시작 날짜}, '%Y-%m-%d %H:%i:%S')
AND 등록 날짜 <![CDATA[ < ]]> STR_TO_DATE(#{끝 날짜}, '%Y-%m-%d %H:%i:%S')

...

 

다음과 같이 부등호를 <![CDATA[ ]]> 로 감싸주면 되는 것입니다.

 

이렇게 한다면 오류가 발생하지 않고 구현하고자 하는 조건에 맞게 쿼리문이 잘 실행될 것입니다.

 

도움이되셨길 바라며 이상 포스팅 마치겠습니다. 감사합니다.

반응형