CLOB, BLOB 데이터 타입과 mybatis에서 CLOB, BLOB insert 및 select 사용 방법
LOB(Large Object)
LOB은 단어 뜻처럼 대용량의 객체(데이터)를 저장하기 위한 데이터 타입들을 지칭하는 용어입니다.
LOB은 텍스트 문서나 이미지, 오디오, 동영상 파일과 같은 데이터베이스 테이블에 저장되는 일반적인 데이터 타입보다 훨씬 큰 데이터를 관리할 때 사용되며, 주로 'CLOB(Character Large Object)'과 'BLOB(Binary Large Object)' 두 가지 유형으로 나뉩니다.
Oracle 관점에서 VARCHAR2가 최대 4000byte까지 지원하기 때문에 4000byte 이상의 데이터 저장에는 CLOB 또는 BLOB이 사용됩니다.
또한 LONG 타입의 경우 과거에 대용량 텍스트 데이터를 저장하기 위해 사용되었으나, 하나의 테이블에서 하나의 LONG 컬럼만 가질 수 있는 단일 컬럼 제한 등의 여러 제약사항이 있으며, 오라클에서는 LONG 타입보다는 CLOB 타입의 사용을 권장하고 있습니다.
CLOB(Character Large Object)
CLOB 역시 단어에서 알 수 있는 것처럼 대용량의 문자형(Character) 객체를 저장하는 데 사용되는 데이터 타입입니다.
CLOB은 ASCII, UTF-8, UTF-16 등의 다양한 문자 인코딩을 지원하며, 오라클 기준 최대 4GB까지 저장할 수 있기 때문에 대량의 텍스트 데이터를 저장하는 데 적합합니다.
// 공식 문서에 따르면 (4 gigabyte -1) * (database block size)
BLOB(Binary Large Object)
BLOB은 대용량의 바이너리(Binary) 객체를 저장하는 데 사용되는 데이터 타입입니다.
CLOB이 텍스트 유형의 대용량 데이터를 저장하는 데 사용되었다면, BLOB은 이미지, 오디오, 동영상 등 텍스트가 아닌 모든 유형의 데이터를 포함할 수 있습니다.
BLOB 역시 오라클 기준 최대 4GB까지 저장할 수 있습니다.
// 공식 문서에 따르면 (4 gigabyte -1) * (database block size)
추가로 Oracle 12.2 Release 공식 문서 기준 대용량 JSON 데이터에 대해 CLOB이 아닌 BLOB 사용이 권장되었지만, 최신 버전(24년 8월 기준)인 Oracle 23 Release 공식 문서에서는 대용량 JSON 데이터에 대해 BLOB 또는 CLOB을 사용하라고 나와있습니다.
(위 내용이 포함된 공식 문서 링크)
&&
CLOB, BLOB 외 LOB 데이터 유형으로는 oracle에서 정의되는 National Character Set을 사용하여 텍스트 데이터를 저장하는 'NCLOB(National Character Large Object)'와 데이터베이스 외부에 저장된 대용량 바이너리 파일을 참조하기 위해 사용되는 'BFILE'가 있습니다.
(mybatis) CLOB, BLOB 사용 방법
-- CLOB
CREATE TABLE clob_test
(
id VARCHAR2(20),
clob_col CLOB,
CONSTRAINTS clob_test_id PRIMARY KEY (id)
);
-- BLOB
CREATE TABLE blob_test
(
id VARCHAR2(20),
blob_col BLOB,
CONSTRAINTS blob_test_id PRIMARY KEY (id)
);
(CLOB, BLOB 데이터 타입 insert 및 select 예시에 사용할 간단한 테이블입니다.)
CLOB insert 및 select 방법
<insert id="insertClob" parameterType="hashMap">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT LOB_SEQUENCE.nextval FROM dual
</selectKey>
INSERT INTO CLOB_TEST
(
id,
clob_col
)
VALUES
(
#{id},
#{clob_col, jdbcType=CLOB}
)
</insert>
먼저 insert의 경우 위 예시와 같이 mapper.xml 파일의 insert 구문 중 CLOB 컬럼의 값이 들어가는 부분에 'jdbcType=CLOB'을 명시해 줌으로써 CLOB의 데이터를 삽입하도록 지정할 수 있습니다.
<!-- selectClob 에서 사용될 resultMap -->
<resultMap id="clobResultMap" type="java.util.Map">
<result column="clob_col" property="clob_col" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>
<!-- select 구문 -->
<select id="selectClob" parameterType="Map" resultMap="clobResultMap">
SELECT clob_col
FROM CLOB_TEST
WHERE id = #{id}
</select>
select의 경우 mapper.xml 파일 내부적으로 resultMap 요소를 만들고 해당 요소를 select 문에서 사용하는 방식이 사용되는데요.
이유는 선언된 resultMap 내부적으로 조회할 컬럼(result colmun)에 대해 jdbcType="CLOB" javaType="java.lang.String" 내용을 명시해 줌으로써 CLOB 타입을 java에서 사용하는 String 타입으로 매핑하기 때문입니다.
추가로 이때 선언된 resultMap을 사용하는 select 문에서는 resultType 속성이 아닌 resultMap 속성을 통해 선언된 resultMap을 사용하겠다고 명시해 주는 것이 필요합니다.
BLOB insert 및 select 방법
<insert id="insertBlob" parameterType="hashMap">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT LOB_SEQUENCE.nextval FROM dual
</selectKey>
INSERT INTO BLOB_TEST
(
id,
blob_col
)
VALUES
(
#{id},
#{blob_col, jdbcType=BLOB}
)
</insert>
BLOB 타입에 대한 insert 역시 CLOB에서와 동일하게 mapper.xml 파일의 insert 구문 중 BLOB 컬럼의 값이 들어가는 부분에 'jdbcType=BLOB'을 명시해 주어 BLOB의 데이터를 삽입하도록 지정할 수 있습니다.
<!-- selectBlob 에서 사용될 resultMap -->
<resultMap id="blobResultMap" type="java.util.Map">
<result column="blob_col" property="blob_col" jdbcType="BLOB" javaType="[B"/>
</resultMap>
<!-- select 구문 -->
<select id="selectBlob" parameterType="Map" resultMap="blobResultMap">
SELECT blob_col
FROM BLOB_TEST
WHERE id = #{id}
</select>
select 역시 CLOB에서의 방식과 동일하게 mapper.xml 파일 내부적으로 resultMap 요소를 만들고 해당 요소를 select 문에서 사용하는 방식이 사용됩니다.
이때 javaType="[B"에서 "[B"는 java의 바이트 배열(byte[])을 가리키는 표현입니다.
'Programming > Oracle' 카테고리의 다른 글
서브쿼리 종류와 개념 정리(스칼라 서브쿼리, 인라인 뷰, 일반 서브쿼리) (0) | 2024.10.20 |
---|---|
LISTAGG 함수 사용 방법 및 예시(여러 행의 값을 하나의 문자열로 결합할 때) (0) | 2024.09.15 |
오라클 NULL 치환 함수 정리 (NVL, NVL2, COALESCE, NULLIF) (0) | 2024.06.06 |
Oracle INSTR 특정 문자를 찾을 때 사용하는 함수 (1) | 2024.05.15 |
oracle 반복문(LOOP, FOR LOOP, WHILE LOOP) 사용 방법 및 예시 (0) | 2024.05.06 |