본문 바로가기
개발자 일지/Java

[ibatis]SELECT 결과가 이상할 때(remapResults 사용하기)

by 네빌링 2021. 4. 23.
반응형

-실무에서 ibatis 사용시 SELECT 쿼리 콘솔 결과와 실제 애플리케이션 출력 결과가 다른 문제를 발견하였다.

-이 문제를 해결하기 위한 remapResults라는 아이바티스 xml 속성을 알아본다.


 프로젝트가 오래된 시스템이라 아직도 ibatis를 사용한다. 사실 xml에 작성하는 쿼리들의 기본적인 속성들은 알아도 모르는 속성들이 상당히 많다. 대표적으로 어제 알게된 remapResults라는 속성...

<select id="getList" parameterClass="map" remapResult="false">
쿼리...
</select> 

 

 위처럼 false로 잡혀 있었는데 이게 왜 잡혀있는지 궁금해하지 않았음에 반성한다ㅜㅜ

일단 발생한 문제는 다음과 같다.


 

 메뉴를 클릭하면 조회할 데이터 리스트를 불러온다. 그때 저 위의 getList라는 이름의 쿼리를 사용한다. 그리고 리스트 위에 엑셀 다운로드 버튼이 있는데 이것을 클릭하면 위의 getList를 한 번 더 사용하여 엑셀 다운로드를 한다. 근데 엑셀다운로드에 뿌려주는 새로 추가한 select 데이터가 뿌려지지 않았다.


 SELECT 절에서 <isNotEmpty>를 사용하여 동적으로 컬럼값을 가져오는 부분을 추가했다. SELECT 절에 동적쿼리를 적용한 것은 처음이었다. 애초에 SELECT 절에도 동적쿼리가 필요한 경우가 있을지 몰랐는데 역시 있었다.(이에 대해서는 생략)

 

 어쨋뜬 동적쿼리는 잘 동작했고 콘솔에 뜨는 SQL문을 DB에서 찍어봐도 정상적으로 추가한 컬럼데이터가 나왔다. 몇시간 삽질 끝에 remapResult라는 속성이 false로 되어 있어서 그렇다는 것을 알게 되었다..true로 바꾸니 정상 작동했다.

 

 정리된 블로그를 살펴보니, ibatis는 하나의 SELECT 절에 대해 첫번째 조회 시 컬럼리스트, 컬럼타입 등을 메모리에 저장하는데, 두번째부터는 이 컬럼목록과 타입을 이용해 처리한다고 한다. 그렇기 때문에 두번째 조회부터는 빠르게 조회된다. 그러나 동적쿼리를 사용하면 매번 컬럼목록이 달라지거나 변경되기 때문에 메모리에 저장된 컬럼 목록과 타입으로 처리되어 정상적으로 SELECT 값이 받아지지 않는다. 이 때 remapResults="true"을 사용하면 SELECT할 때마다 컬럼목록과 타입을 사용하게 된다.

 

쨋뜬 이렇게 해결하긴 했는데 remapResultstrue로 주면 메모리 캐쉬를 사용하지 않기 때문에 조회가 느려진다. 데이터가 몇만건이 있기 때문에 이런식으로 사용하긴 어렵다고 판단해서 Excel전용쿼리를 하나 비슷하게 만들어서 remapResults="false"로 적용했다. 중복이 엄청 발생하지만 조회 속도가 더 중요하기 때문에..중복도 제거하는 방법을 고민해봐야겠다.

 

 

반응형