개발 등/MyBatis

iBatis 동적쿼리로 생성한 <select> 를 두번 호출했을 경우 에러가 발생하면 (remapResults="true")

darkhorizon 2010. 8. 27. 11:00
728x90
반응형

 <select id="selectFilename" parameterClass="Map" resultClass="String">
  SELECT 
   $column$
  FROM 
TABLE_NAME
  WHERE
   seq = #seq#
 </select>

위와 같이 작성된 쿼리를 처음 호출 했을 경우엔 정상적으로 작동한다.
예를 들어 column에 'name1'이란 값을 넣었다고 하면
select name1 from TABLE_NAME WHERE seq = 111
이란 쿼리가 실행된다.
문제는 두번째 호출했을 경우 발생한다.
두번째 호출에서 column에 'name2'란 값을 넣게되면
로그엔 정상적으로
select name2 from TABLE_NAME WHERE seq = 111
이렇게 실행되지만, 실제론 에러가 발생하면서
'com.microsoft.sqlserver.jdbc.SQLServerException: 열 이름 name1이(가) 잘못되었습니다.'
라는 에러내용이 뜬다.

이런 경우가 발생하는 이유는
<select> 일 경우 반환되는 칼럼의 값이 동일하다고 가정하기 때문이다.
즉 동일한 id의 <select>  에서 발생하는 칼럼의 결과를 ResultSetMetaData에 저장하게 된다.
위의 경우라면 첫번째 호출된 결과로 metadata엔 'name1'이란 칼럼명이 저장되어 있게 된다는 것이다.
그런데 두번째 호출이 왔을 땐 호출의 결과가 'name2'이고 iBatis는 이 컬럼명을 metadata에서 검색하게 되는데,
저장되어 있는 컬럼이 name1이기 때문에 제대로 mapping 시키지 못하고 에러를 발생시키는 것이다.

이럴 경우엔 remapResults="true" 란 속성을 추가하게 되면
metadata에서 결과를 비교하는 게 아니라 새로운 쿼리를 작성하게 된다.
그래서 위의 에러는 해결할 수가 있다.
하지만 매번 새로운 쿼리를 작성하게 됨으로, 메모리에 부하가 걸리는 문제가 발생하게 된다.


728x90