[Oracle 11g Enterprise] / [Mybatis 3.2.7] 기준


varchar2 데이터타입은 최대 사이즈를 4,000byte 까지 줄 수 있다. 그런데 4,000byte 이상의 데이터를 저장할 일이 있다. base64로 인코딩된 이미지라거나, xml 파싱된 영수증내용이라거나 아주 긴 블로그의 글이라거나. 그럴 때 oracle 에서 사용하는 데이터타입은 clob 이다.


CLOB은 XML 형태로 데이터를 지정하게 되는데, DB 툴에서는 select * from table로 간단하게 데이터 확인이 가능하지만, mybatis를 사용하게 되면 일반적인 select 쿼리로는 활용이 불가능하다. 그럴 때 다음과 같이 mybatis의 select 구절에 resultmap을 설정하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
<!-- resultMap 지정 -->
<resultMap id="QID_CLOB" type="hashMap" >
    <result property="ETC" column="etc" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>
 
<!-- 조회쿼리 -->
<select id="QID_SELECT_INFO" parameterType="hashMap" resultMap="QID_CLOB" >
SELECT
    etc
FROM
    table
</select>
cs


사용법은 심플하다.

select 쿼리의 resultMap 파라미터는 별도로 선언할 resultMap의 ID를 지정해준다.

별도로 선언할 resultMap에서는 id를 맞춘 후, clob으로 가져올 컬럼명(column)을 지정하고, jdbcType을 clob으로 지정, 이를 어떠한 column name으로 내보낼 것인지 지정(property)해주면 된다.



1
2
3
4
5
6
SELECT
    a.etc AS a_etc
    b.etc AS b_etc
FROM
    table_1 a
    LEFT OUTER JOIN table_2 b ON a.no = b.no
cs

그런데 여기서 한가지 궁금한 점이 생기게 된다. 

각기 다른 테이블을 조인 후 가져올 때, 각 테이블의 같은 이름 clob은 어떻게 가져올까 하는 점이다.

테스트를 잠시 해보았는데 생각보다 매우 간단했다.


처음에는 같은 컬럼명이니까 위의 resultMap을 그냥 가져다 쓰면 ETC 컬럼을 ETC Property로 출력해주겠거니, 했지만 전혀 그렇지 않았다.(왜인지 Java의 Service 처럼 동작할거라 생각;)

그래서 두번째 방법을 사용해보았다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- resultMap 지정 -->
<resultMap id="QID_CLOB" type="hashMap" >
    <result property="A_ETC" column="a_etc" jdbcType="CLOB" javaType="java.lang.String"/>
    <result property="B_ETC" column="b_etc" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>
 
<!-- 조회쿼리 -->
<select id="QID_SELECT_INFO" parameterType="hashMap" resultMap="QID_CLOB" >
SELECT
    a.etc AS a_etc
    b.etc AS b_etc
FROM
    table_1 a
    LEFT OUTER JOIN table_2 b ON a.no = b.no
</select>
cs


그랬더니 각기 다른 테이블에서 동일한 네이밍의 clob 컬럼을 정상적으로 가져올 수 있었다.

간단한 테스트 결과, resultMap의 동작구조는 SELECT가 우선적으로 실행된 결과를 가져온 뒤, 이를 resultMap에서 처리하는 구조로 여겨진다. 결과적으로 resultMap은 Alias로 잡힌 컬럼명을 인식한다는 말이다.

블로그 이미지

김생선

세상의 모든것을 어장관리

티스토리 툴바