티스토리 뷰

발생일: 2010.05.06

문제:
현업이 종종 특정 데이터를 엑셀로 뽑아달라는 요청을 합니다.
요청이 간헐적이고 같은 데이터를 시도 때도 없이 새로 뽑아달라는 요청을 해서,
좀 효율적으로 처리하고자 동적 쿼리를 수행하는 메뉴를 하나 만들었습니다.

해당 쿼리가 자주 변하고 보안 문제도 있었기 때문에,
관리를 편하게 하기 위해 DB 대신 파일 기반으로 설계했습니다.
서버에 올라가 있는 sql 파일을 읽어 목록을 구성하고,
해당 쿼리를 담은 sql 파일을 읽어 엑셀로 다운로드 받을 수 있는 기능입니다.
(우리는 요청 쿼리를 담은 sql 파일을 서버에 올리기만 하면 되도록 말이죠.)

iBATIS 를 사용하고 있어 파일에서 읽은 쿼리를 아래와 같이 $sql$ 형태로 전달하도록 했는데,

    <select id="dynamicQuery" resultClass="hashmap">
        $sql$
    </select>

첫 번째는 정상적으로 실행되고, 그 이후 다른 쿼리를 다운로드 받으려 시도했을 때
아래와 같은 에러가 발생합니다.


Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred while applying a result map.  
--- Check the 쿼리ID - AutoResultMap.
--- Check the result mapping for the 컬럼명 property.  
--- Cause: java.sql.SQLException: 부적합한 열 이름


문제가 뭘까요...


해결책:
iBATIS 는 기본적으로 해당 쿼리에 대한 메타데이터(필드, 타입 등)를 캐시한다고 합니다.
따라서 위 dynamicQuery 구문이 실행된 이후 그 결과의 컬럼 정보가 캐시되었고,
이후 다른 컬럼 정보를 포함한 쿼리가 dynamicQuery 로 실행되었을 때
캐시된 컬럼 정보로 값을 찾으려하다 오류가 난 거였던 거죠.

이 경우엔, 아래와 같이 해당 select 구문의 메타데이터를 캐시하지 않도록 설정하면 된다고 합니다.

    <select id="dynamicQuery" resultClass="hashmap" remapResults="true">
        $sql$
    </select>


아래 포스트에서 참고했습니다.

반응형
댓글
공지사항