개발/DB

[Oracle Blob Maping] Cause: java.sql.SQLException: 부적합한 열 유형

Mr.Lee 하루 2025. 7. 16. 08:13

Oracle BLOB 매핑 오류 해결 가이드

  • 에러가 발생했다. 에러 없는 세상에서 살고 싶다.
  • 이상하다 로컬에서는 에러가 나지 않던게 서버에 적용시키니까 에러가 난다.
  • Blob 데이터를 select 할때 에러가 난다.
  • 오류 내용을 살펴 보자.

💥 오류 내용

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; 
SQL state [99999]; error code [17004]; 
Cause: java.sql.SQLException: 부적합한 열 유형: getString not implemented for class oracle.jdbc.driver.T4CBlobAccessor

❓ 원인 분석

  • Oracle의 BLOB 컬럼을 Java에서 getString()으로 읽으려 했기 때문에 발생한 오류입니다.
  • T4CBlobAccessorgetString() 호출을 지원하지 않으며, byte[] 또는 java.sql.Blob 형태로 처리해야 합니다.

✅ 해결 방법

1. resultMap에서 jdbcType="BLOB" 설정 및 VO 수정

iBATIS XML 예시

<resultMap id="exampleResultMap" class="com.example.YourVO">
  <result property="id" column="ID"/>
  <result property="blobData" column="BLOB_COLUMN" jdbcType="BLOB"/>
</resultMap>

VO 클래스 예시

// BLOB을 byte 배열로 처리
private byte[] blobData;

또는

// java.sql.Blob으로 처리
private java.sql.Blob blobData;


2. Custom TypeHandler 사용 (String으로 변환하려는 경우)

TypeHandler 클래스

public class BlobToStringTypeHandler extends BaseTypeHandler<String> {
    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        Blob blob = rs.getBlob(columnName);
        return new String(blob.getBytes(1, (int) blob.length()));
    }

    @Override
    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setBytes(i, parameter.getBytes());
    }

    // 기타 getNullableResult 오버라이드 생략
}

iBATIS 설정

<typeHandler javaType="java.lang.String" jdbcType="BLOB" handler="com.example.BlobToStringTypeHandler"/>


3. 디버깅: BLOB 컬럼을 SELECT에서 일시적으로 제외

SELECT ID, NAME FROM YOUR_TABLE -- BLOB 컬럼 제외

정상 동작하면, BLOB 컬럼 매핑 문제로 확정할 수 있습니다.



📌 요약

항목 설명
문제 BLOB 컬럼을 getString()으로 처리하려 해서 발생
해결 방법 1 VO에서 byte[] 또는 Blob 타입 사용
해결 방법 2 Custom TypeHandler로 변환 처리
해결 방법 3 일시적으로 BLOB 제외하여 문제 확인
기타 JDBC 드라이버 버전 확인 필요

생각정리

  • 사실 아직도 로컬환경과 서버환경에서의 차이가 뭔지 파악은 못했다.
  • ojdbc 버전도 모두 같고, 자바 버전도 같다. 프로젝트 환경도 똑같다.
  • 일단... 주석처리하고 테스트를 진행하는 방향으로 마음을 먹었다.