아이바티스 SELECT * FROM $tableName$ 사용시 주의점
tableName을 파라미터로 넘겨서,
해당 테이블의 컬럼,값을 맵으로 가져와서 사용했습니다.
의도는 A,B,C 3개의 비슷한 테이블이 있어서,
간단히 한개의 쿼리로 동적인 호출을 하려고 했었죠.
<select id="getAPIData"
resultClass="java.util.HashMap"> |
1. A,B,C 3개의 테이블에 대해 위 쿼리를 순차적으로 호출하고 난
결과는?
- A 테이블의 컬럼 정보는 정상적으로 가져옵니다.
하지만 B,C 테이블은 A 테이블에 있는 컬럼 정보만 가져오더군요.
2. 이유는?
- 아이바티스는 기본적으로 해당 쿼리(id=getAPIData)에 대한 메타데이터를 캐싱한다고 합니다.
(컬럼, 타입 등)
A 테이블에 대해 쿼리를 호출하여 해당 메타데이터가 캐싱된 상태에서,
B와 C 테이블 정보를 가져오고자 하니 어떻게 될까요?
이미 캐싱된 메타데이터를 사용하기 때문에 A 테이블에 있는 컬럼 값만 조회가 되는 것이었습니다.
A,B,C가 컬럼이 유사하여 에러가 안나고 이와 같은 현상이 발생했습니다.
아예 컬럼 정보가 틀린 테이블을 동적 호출한다면 AutoResultMap Exception이 발생한다고합니다.
3. 해결방안은?
1) 테이블에 대해 동적 호출을 하지 않으면 됩니다.
2) 해당 쿼리에 remapResult="true" Attribute를 주어, 쿼리 호출시마다 메타데이터 정보를 셋팅하도록
설정합니다.
자주 호출되는 쿼리라면 해당 메타데이터가 캐싱이 안되기 때문에 오버헤드가 발생하겠죠?
가이드에서도 해당 Attribute를 활성화하지 않는 걸 추천한다고 하네요.
<select id="getAPIData"
resultClass="java.util.HashMap" remapResults="true"> /* UploadExcel.getAPIData */ |