대용량 객체(LOB) 다루기

Java에서 PostgreSQL 데이터베이스 질의하기

Miller Trujillo

Staff Software Engineer

데이터베이스의 대용량 객체

  • BLOB: 이진 대용량 객체(이미지, 동영상, PDF)
  • CLOB: 문자 대용량 객체(긴 텍스트, XML, JSON)

BLOB 및 CLOB 표현

Java에서 PostgreSQL 데이터베이스 질의하기

왜 BLOB과 CLOB인가?

  • VARCHAR는 작은 데이터에 적합
  • BLOB/CLOB은 매우 큰 콘텐츠용
  • 스트리밍 지원: 청크 단위로 읽고 쓰기

비유 - 영화 스트리밍

Java에서 PostgreSQL 데이터베이스 질의하기

Java에서 BLOB 쓰기

String sql = "INSERT INTO covers (book_id, image) VALUES (?, ?)";


try (PreparedStatement pstmt = conn.prepareStatement(sql); FileInputStream fis = new FileInputStream("cover.png")) {
pstmt.setInt(1, 101);
pstmt.setBinaryStream(2, fis);
pstmt.executeUpdate();
}
  • INSERT - 테이블에 새 행 추가
  • setBinaryStream() - BLOB 컬럼에 이진 데이터 스트리밍
Java에서 PostgreSQL 데이터베이스 질의하기

Java에서 CLOB 쓰기

String sql = "INSERT INTO manuscripts (book_id, content) VALUES (?, ?)";

try (PreparedStatement pstmt = conn.prepareStatement(sql);

FileReader reader = new FileReader("manuscript.txt")) {
pstmt.setInt(1, 101);
pstmt.setCharacterStream(2, reader);
pstmt.executeUpdate();
}

setCharacterStream() - CLOB 컬럼에 텍스트 데이터 스트리밍

Java에서 PostgreSQL 데이터베이스 질의하기

Java에서 LOB 읽기

  • InputStream은 바이트를, Reader는 문자를 읽음
  • BLOB: getBinaryStream()은 InputStream 반환
  • CLOB: getCharacterStream()은 Reader 반환
String sql = "SELECT image FROM covers WHERE book_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 101);
    try (ResultSet rs = pstmt.executeQuery()) {

if (rs.next()) {
try (InputStream is = rs.getBinaryStream("image");
FileOutputStream fos = new FileOutputStream("out.png")){
is.transferTo(fos);
} } } }
Java에서 PostgreSQL 데이터베이스 질의하기

Reader로 CLOB 읽기

String sql = "SELECT content FROM manuscripts";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
     ResultSet rs = pstmt.executeQuery()) {

while (rs.next()) {
try (Reader reader = rs.getCharacterStream("content")) {
char[] cb = new char[30];
reader.read(cb); // 0~29 문자
reader.read(cb); // 30~59 문자 } } }
Java에서 PostgreSQL 데이터베이스 질의하기

LOB 모범 사례

  • 📂 URL·경로 같은 참조로 저장하는 것을 권장
  • ⏩ 스트리밍 API 사용: (setBinaryStream(), getBinaryStream(), setCharacterStream())
  • 🚫 매우 큰 객체는 잦은 업데이트를 피함

$$

$$

대용량 객체 표현

Java에서 PostgreSQL 데이터베이스 질의하기

연습해 봅시다!

Java에서 PostgreSQL 데이터베이스 질의하기

Preparing Video For Download...