ResultSet 인터페이스는 데이터베이스 테이블에서 CLOB 타입의 값을 가져오기 위해 getClob() 메서드를 제공합니다. 여기에 더해, CLOB 값을 문자 스트림 형태로 읽을 수 있는 getCharacterStream() 메서드도 함께 제공됩니다.
getClob()과 getCharacterStream()의 차이점
getCharacterStream() 메서드는 getClob()과 마찬가지로 컬럼의 인덱스를 나타내는 정수 값 또는 컬럼 이름을 나타내는 문자열을 매개변수로 받아 해당 컬럼의 값을 조회합니다.
두 메서드의 차이점은 반환 타입에 있습니다. getClob() 메서드가 Clob 객체를 반환하는 반면, getCharacterStream() 메서드는 Reader 클래스 객체를 반환합니다. 따라서 대용량 텍스트 데이터를 스트림 방식으로 순차적으로 읽어야 할 때 유용하게 사용할 수 있습니다.
예제 준비하기
예제를 진행하기 위해 데이터베이스에 다음과 같은 구조의 MyData 테이블을 생성했다고 가정해 보겠습니다.
+---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | Name | varchar(255) | YES | | NULL | | | Article | longtext | YES | | NULL | | +---------+--------------+------+-----+---------+-------+
그리고 이 테이블에 'JavaFX'라는 이름과 함께 대용량 텍스트 데이터를 삽입해 두었습니다. 이제 getString()과 getCharacterStream() 메서드를 사용하여 MyData 테이블의 내용을 조회하는 프로그램을 작성해 보겠습니다.
예제 코드
import java.io.FileWriter;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class RetrievingClob_CharStream {
public static void main(String args[]) throws Exception {
// 드라이버 등록
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 데이터베이스 연결
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// Statement 객체 생성
Statement stmt = con.createStatement();
// 데이터 조회
ResultSet rs = stmt.executeQuery("select * from MyData");
int j = 0;
System.out.println("Contents of the table are: ");
while(rs.next()) {
System.out.println(rs.getString("Name"));
Clob clob = rs.getClob("Article");
Reader r = clob.getCharacterStream();
String filePath = "E:\\Data\\clob_output"+j+".txt";
FileWriter writer = new FileWriter(filePath);
int i;
while ((i=r.read())!=-1) {
writer.write(i);
}
writer.close();
System.out.println(filePath);
j++;
}
}
}
실행 결과
Connection established...... Contents of the table...... JavaFX E:\Data\clob_output0.txt
결과 확인하기
프로그램 실행 후 출력된 경로의 파일을 열어보면, 테이블에서 조회한 CLOB 데이터의 내용이 그대로 저장되어 있는 것을 확인할 수 있습니다.

이처럼 getCharacterStream() 메서드를 활용하면 Clob 객체를 직접 다루지 않고도 Reader 스트림을 통해 대용량 텍스트 데이터를 손쉽게 파일 등으로 출력할 수 있습니다.