[ibatis] 동적 쿼리를 사용하기 위한 remapResults
<select id="getList" parameterClass="java.util.Map">
SELECT TEST_COLUMN
<isNotEmpty property="testParam1">
, TEST_COLUMN01
</isNotEmpty>
<isEqual property="testParam2" compareValue="Y">
, TEST_COLUMN02
</isEqual>
FROM TEST
</select>
위와 같은 ibatis 구문이 있다고 가정하면,
아무 조건 없이 구문이 실행되면 TEST_COLUMN이 조회될 것이다.
그 이후 testParam1에 값을 넣어 보내거나 testParam2를 Y로 보내서 실행하면 에러가 날 것이다.
ibatis는 최초 쿼리를 조회한 후 조회 결과의 메타데이터(컬럼리스트, 테이블명) 를 캐쉬에 저장하여 다음 동일한 쿼리를 호출할 때 저장된 컬럼으로 데이터를 보여준다.
이는 조회 성능을 향상시키기 위한 ibatis의 노력(?)이라고 할 수 있는데, 위 예제와 같이 조건에 따라 조회 컬럼이 변하는 동적 쿼리의 경우에는 컬럼을 찾을 수 없다는 에러가 발생한다.
최초 메타데이터는 TEST_COLUMN 한 개만을 기억하고 있는데, TEST_COLUMN01 또는 TEST_COLUMN02가 조회가 된다면 에러가 발생하는 것이다.
이런 경우 메타데이터에 컬럼 정보를 저장하지 않고, 조회할 때마다 컬럼을 매핑시켜 가져올 수 있는데,
해당 속성이 remapResults = "true" 이다.
<select id="getList" parameterClass="java.util.Map" remapResults="true">
SELECT TEST_COLUMN
<isNotEmpty property="testParam1">
, TEST_COLUMN01
</isNotEmpty>
<isEqual property="testParam2" compareValue="Y">
, TEST_COLUMN02
</isEqual>
FROM TEST
</select>
위와 같이 select 구문의 속성에 remapResults="true" 를 추가해 준다.
모든 select 쿼리에 사용해도 무방하나, 조회할 때마다 매번 매핑을 하게 되므로 캐쉬에 저장할 때보다는 성능 저하가 있을 수 있다.
그렇기 때문에 조회 컬럼이 변동될 수 있는 동적 쿼리에서만 사용하는 것이 좋다.
최근댓글