CLOB(Character Large Object)은 SQL의 내장 데이터 타입 중 하나로, 대용량 텍스트 데이터를 저장하기 위해 사용됩니다. 이 데이터 타입을 활용하면 최대 2,147,483,647자(약 21억 자)에 달하는 문자 데이터를 저장할 수 있습니다.
JDBC API의 java.sql.Clob 인터페이스가 바로 이 CLOB 데이터 타입을 나타냅니다. JDBC에서 Clob 객체는 SQL 로케이터(locator)를 기반으로 구현되기 때문에, 실제 데이터 자체가 아니라 SQL CLOB을 가리키는 논리적 포인터를 보유하게 됩니다.
MySQL 데이터베이스는 네 가지 타입의 변수를 통해 CLOB 데이터 타입을 지원합니다.
- TINYTEXT: 최대 2⁸-1(255)자까지 저장할 수 있는 CLOB 타입
- TEXT: 최대 2¹⁶-1(65,535)자까지 저장할 수 있는 CLOB 타입
- MEDIUMTEXT: 최대 2²⁴-1(16,777,215)자까지 저장할 수 있는 CLOB 타입
- LONGTEXT: 최대 2³²-1(4,294,967,295)자까지 저장할 수 있는 CLOB 타입
데이터베이스 테이블에 CLOB 데이터 타입 저장하기
JDBC 프로그램을 사용해 CLOB 데이터 타입을 데이터베이스에 저장하려면 아래 단계를 순서대로 따르면 됩니다.
1단계: 데이터베이스 연결
DriverManager 클래스의 getConnection() 메서드를 사용하면 데이터베이스에 연결할 수 있습니다.
MySQL URL인 jdbc:mysql://localhost/sampleDB(sampleDB는 데이터베이스 이름)와 사용자 이름, 비밀번호를 getConnection() 메서드의 매개변수로 전달하여 MySQL 데이터베이스에 연결합니다.
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
2단계: PreparedStatement 생성
Connection 인터페이스의 prepareStatement() 메서드를 사용하여 PreparedStatement 객체를 생성합니다. 이 메서드에는 플레이스홀더(?)가 포함된 INSERT 쿼리를 매개변수로 전달합니다.
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Technologies(Name,
Type, Article ) VALUES (?, ?, ?)");3단계: 플레이스홀더에 값 설정
PreparedStatement 인터페이스의 setter 메서드를 사용하여 각 플레이스홀더에 값을 설정합니다. 이때 컬럼의 데이터 타입에 맞는 메서드를 선택해야 합니다. 예를 들어 컬럼이 VARCHAR 타입이면 setString() 메서드를, INT 타입이면 setInt() 메서드를 사용합니다.
CLOB 타입의 경우에는 setCharacterStream() 또는 setClob() 메서드를 사용해 값을 설정할 수 있습니다. 두 메서드 모두 매개변수 인덱스를 나타내는 정수와 Reader 클래스 객체를 인자로 전달합니다.
pstmt.setString(1, "JavaFX");
pstmt.setString(2, "Java Library");
FileReader reader = new FileReader("E:\\images\\javafx.txt");
pstmt.setClob(3, reader);
pstmt.execute();
4단계: 구문 실행
PreparedStatement 인터페이스의 execute() 메서드를 사용하여 앞서 생성한 PreparedStatement 객체를 실행합니다.
데이터베이스에서 CLOB 데이터 조회하기
ResultSet 인터페이스의 getClob() 메서드는 컬럼의 인덱스를 나타내는 정수(또는 컬럼 이름을 나타내는 String 값)를 받아, 지정된 컬럼의 값을 조회한 뒤 Clob 객체 형태로 반환합니다.
while(rs.next()) {
System.out.println(rs.getString("Name"));
System.out.println(rs.getString("Type"));
Clob clob = rs.getClob("Article");
}Clob 인터페이스의 getCharacterStream() 메서드는 현재 Clob 객체의 내용을 조회하여 Reader 객체로 반환합니다.
getClob() 메서드를 사용하면 Clob의 내용을 Reader 객체로 얻을 수 있고, 여기서 읽어온 내용을 FileOutputStream 객체의 write() 메서드로 텍스트 파일에 저장할 수 있습니다.
Reader r = clob.getCharacterStream();
char cbuf[] = new char[r.read()];
r.read(cbuf);
FileOutputStream outPutStream = new
FileOutputStream("E:\\images\\clob_output"+i+".txt");
outPutStream.write(cbuf.toString().getBytes());
전체 예제 코드
다음 예제는 MySQL 데이터베이스에 CLOB 데이터 타입을 포함한 테이블을 생성하고, 파일에서 읽어온 대용량 텍스트 데이터를 삽입한 후, 다시 해당 텍스트를 조회하여 별도의 텍스트 파일로 저장하는 전 과정을 보여줍니다.
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class ClobExample {
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 stmt = con.createStatement();
stmt.execute("CREATE TABLE Technologies( Name VARCHAR(255), Type VARCHAR(255), Article LONGTEXT)");
System.out.println("Table Created......");
// 데이터 삽입
String query = "INSERT INTO Technologies(Name, Type, Article ) VALUES (?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, "JavaFX");
pstmt.setString(2, "Java Library");
FileReader reader = new FileReader("E:\\images\\javafx.txt");
pstmt.setClob(3, reader);
pstmt.execute();
pstmt.setString(1, "CoffeeScript");
pstmt.setString(2, "Scripting Language");
reader = new FileReader("E:\\images\\coffeescript.txt");
pstmt.setClob(3, reader);
pstmt.execute();
pstmt.setString(1, "Cassandra");
pstmt.setString(2, "NoSQL Database");
reader = new FileReader("E:\\images\\cassandra.txt");
pstmt.setClob(3, reader);
pstmt.execute();
// 데이터 조회
ResultSet rs = stmt.executeQuery("select * from Technologies");
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......
Table Created......
Contents of the table are:
JavaFX
Java Library
E:\images\clob_output1.txt
CoffeeScript
Scripting Language
E:\images\clob_output2.txt
Cassandra
NoSQL Database
E:\images\clob_output3.txt