[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 쿼리에 사용해도 무방하나, 조회할 때마다 매번 매핑을 하게 되므로 캐쉬에 저장할 때보다는 성능 저하가 있을 수 있다. 

 

그렇기 때문에 조회 컬럼이 변동될 수 있는 동적 쿼리에서만 사용하는 것이 좋다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기