데이터 용량을 최대로 지원하는 자료형 사용하기
VARCHAR2는 최대 4000Byte 까지만 지원하므로, 동영상이나 큰 문자열 데이터는 CLOB, BLOB 등의 데이터 타입을 활용하여 데이터베이스에 저장할 수 있다. 하지만 해당 타입은 일반 문자열과 사용하는 방식이 다를 뿐더러, 용량이 커서 DB 조회 성능저하를 불러올 수 있으므로 신중하게 사용해야한다.
LOB(Large Object)는 이름 그대로 대용량 데이터를 저장할 수 있는 자료형을 의미한다.
CLOB : 문자형 대용량 객체, 고정길이와 가변길이 문자집합 지원
NCLOB : 유니코드를 지원하는 문자형 대용량 객체
BLOB : 이진형 대용량 객체
BFILE : OS에 저장되는 이진 파일의 이름과 위치 / 읽기 모드만 지원
이 중 CLOB은 Oracle 10g 버전 이후로 지원되는 LOB 타입 종류 중 하나이며, 문자열이나 이미지 데이터를 4GB 까지 저장 가능하다. Oracle 서버는 VARCHAR2 와 CLOB 타입 사이의 암시적 변환을 수행한다.
CLOB 데이터는 INSERT할 때 TO_CLOB()을 사용하거나 VARCHAR2와 동일하게 편리하게 데이터 추가가 가능하다. 다만, 조회할 때 정말 까다로운데, 일반적인 구문으로는 절대 조회가 되지 않는다. data 타입이 CLOB일 경우, JSON으로 변환되지 않는 것으로 보인다.
SELECT DBMS_LOB.SUBSTR(clob칼럼, 가져올길이, offset)
FROM ...
위와 같이 DBMS_LOB
을 사용하여 CLOB을 조회하는 방법이 있다. SUBSTR함수도 함께 넣은 이유는 CLOB 타입에는 html 태그를 일반적으로 포함해서 저장하기 때문이다. 만약 부하 발생의 위험을 감소하고 싶다면, DBMS_LOB
을 사용하여 데이터의 일부만 보여지게 하는 것이 좋다고 한다.
하지만 해당 방법은 html 태그 제외 4000Byte 까지만 조회가 가능하다... 혹시 추가적으로 더 조회하고 조회하고 싶다면 아래와 같이 Mybatis에서 설정하는 것도 가능하다.
<!-- 1. resultMap을 만들어 준다. -->
<resultMap type="EgovMap" id="minwonTableList">
<result property="sno" column="sno" />
<result property="title" column="title" />
<result property="content" column="content" jdbcType="CLOB" javaType="java.lang.String" />
<result property="dept" column="dept" />
<result property="status" column="stat" />
<result property="pname" column="pname" />
<result property="rdate" column="rdate" />
</resultMap>
<!-- 2. 쿼리에 해당 resultMap의 ID를 속성에 추가한다. -->
<select id="selectMinwonTableList" parameterType="EgovMap" resultType="EgovMap" resultMap="minwonTableList">
SELECT CNSL_QNA_NO SNO, MW_CNSL_SJ TITLE, SUBSTR(MW_APPL_CN, 0, 500) CONTENT, CNSL_DEP_NM DEPT,
DEAL_STATE_NM STATUS, ANS_USR_NM PNAME, TO_DATE(REG_DT, 'YYYY-MM-DD HH24:MI:SS') RDATE
FROM ...
</select>