Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

JDBC setBlob() vs setBinaryStream(): 두 메서드의 차이점과 사용 기준 완벽 정리

JDBC setBlob() 메서드란?

setBlob() 메서드는 PreparedStatement를 통해 데이터베이스의 BLOB(Binary Large Object) 타입 컬럼에 값을 설정할 때 사용하는 메서드입니다. 이 메서드는 용도에 따라 세 가지 형태로 오버로딩되어 제공됩니다.

  • void setBlob(int parameterIndex, Blob x): 지정된 인덱스의 매개변수에 주어진 Blob 객체의 값을 설정합니다.

  • void setBlob(int parameterIndex, InputStream inputStream): 지정된 인덱스의 매개변수 값으로 주어진 입력 스트림(InputStream)의 전체 내용을 설정합니다.

  • void setBlob(int parameterIndex, InputStream inputStream, long length): 입력 스트림에서 지정된 길이(length)만큼의 내용을 읽어 해당 매개변수 값으로 설정합니다.

JDBC setBinaryStream() 메서드란?

setBinaryStream() 메서드는 주어진 InputStream의 내용을 그대로 지정된 인덱스의 매개변수 값으로 설정할 때 사용합니다. 마찬가지로 세 가지 형태로 오버로딩되어 있습니다.

  • void setBinaryStream(int parameterIndex, InputStream x): 지정된 인덱스의 매개변수 값으로 주어진 입력 스트림의 내용을 설정합니다.

  • void setBinaryStream(int parameterIndex, InputStream x, int length): 입력 스트림에서 지정된 바이트 수만큼의 내용을 읽어 해당 매개변수 값으로 설정합니다.

  • void setBinaryStream(int parameterIndex, InputStream x, long length): int 대신 long 타입으로 길이를 지정하여, 더 큰 데이터도 처리할 수 있는 형태입니다.

두 메서드의 핵심 차이점

두 메서드의 가장 중요한 차이는 데이터를 서버로 전송하는 방식을 결정하는 주체에 있습니다.

setBlob() 메서드를 사용하면 드라이버에게 "이 매개변수 값은 반드시 BLOB 타입으로 서버에 전송하라"고 명확하게 지시하는 것입니다. 즉, 데이터 타입이 개발자 의도대로 고정됩니다.

반면 setBinaryStream() 메서드를 사용하면 드라이버가 먼저 값을 어떤 형식(LONGVARBINARY 또는 BLOB)으로 전송할지 스스로 판단한 뒤 서버로 전송합니다. 따라서 최종적으로 적용되는 SQL 타입은 JDBC 드라이버의 구현과 데이터베이스에 따라 달라질 수 있습니다.

그렇다면 어떤 메서드를 선택해야 할까?

저장하려는 데이터가 명확히 BLOB 타입 컬럼(예: 이미지, 동영상 등 대용량 바이너리 파일)에 들어가야 한다면 setBlob()을 사용하는 것이 안전합니다. 드라이버의 판단에 의존하지 않으므로 타입 불일치로 인한 예외 발생 가능성을 줄일 수 있습니다.

반대로 일반적인 바이너리 데이터를 유연하게 처리하고 싶거나, 데이터 크기가 크지 않아 LONGVARBINARY로도 충분한 경우에는 setBinaryStream()이 더 간편할 수 있습니다. 특히 대용량 파일을 다룰 때는 스트림을 직접 전달하는 두 메서드 모두 메모리 효율성 측면에서 유리하므로, 데이터의 성격과 대상 컬럼의 SQL 타입을 고려해 적절한 메서드를 선택하는 것이 좋습니다.