본문 바로가기
SI 업무/나만의 프로젝트 만들기

7. clob 의 경우는 어떻게 CustomResultMap에 담지?

by 새로운걸 배우는게 너무 싫은 IT 복붙러 2024. 11. 30.
728x90

 

mybatis 로 수행 하는 sql 중 만약 컬럼의 type 이 clob이라면?

정말 복잡하구만..

 

clob 의 담길수 있는 값은 text 형식으로 최대 4G 까지 담긴다.

 

이럴 경우 기존에 만든 CustomResultMap.java 로 가능 할까?

 

불가능 하다고 한다.

왜 불가능한지는 아래 설명을 읽어 봤지만 100% 이해는 안간다.

더보기

1. CLOB은 일반적인 Java 객체가 아님

CLOB 데이터는 Oracle 데이터베이스에서 대량의 텍스트를 저장하기 위해 사용되는 특별한 데이터 유형입니다. Java에서 CLOB은 일반적으로 java.sql.Clob 객체로 매핑됩니다. 이 객체는 대량의 텍스트를 메모리에 로드하지 않고 스트림 방식으로 처리하기 위해 설계되었습니다.

ListOrderedMap의 put 메서드는 단순히 키와 값을 매핑하는 역할만 하며, 입력값(Object)을 처리하거나 변환하지 않습니다. 따라서 CLOB 객체가 그대로 저장되며, 이를 문자열로 변환하거나 활용하려면 추가적인 로직이 필요합니다.

 

clob도 처리 할수 있도록 아래처럼 CustomResultMap을 고쳐야 한다.

 

package com.example.myproject.biz.com;

import org.apache.commons.collections4.map.ListOrderedMap;

import java.io.IOException;
import java.io.Reader;
import java.io.Serial;
import java.io.Serializable;
import java.sql.SQLException;

public class CustomResultMap extends ListOrderedMap<String, Object> implements Serializable {
    @Serial
    private static final long serialVersionUID = -3373848823544700461L;


    // put() 메소드 오버라이드
    @Override
    public Object put(String key, Object value) {

        if (value instanceof java.sql.Clob) {
            value = convertClobToString((java.sql.Clob) value);
        }
        return super.put(key, value);
    }

    private String convertClobToString(java.sql.Clob clob) {
        StringBuilder sb = new StringBuilder();
        try (Reader reader = clob.getCharacterStream()) {
            char[] buffer = new char[1024];
            int bytesRead;
            while ((bytesRead = reader.read(buffer)) != -1) {
                sb.append(buffer, 0, bytesRead);
            }
        } catch (IOException | SQLException e) {
            e.printStackTrace();
            // 필요하면 예외를 로깅하거나 처리
        }
        return sb.toString();
    }

    // 필요에 따라 추가적인 메소드들을 추가할 수 있습니다.
    public Object get(String key) {
        return super.get(key);
    }

    public String toString() {
        return super.toString();
    }
}

 

 

소스를  바꿨으니 user table 에 clob 컬럼을 추가 하고 test 해보자.

alter table users add contents clob;

 

아래처럼 data 를 넣었다.

 

Postman에서 Reqeust를 쏘고 처리가 된 결과가 나왔다.

CustomResultMap이 정상 작동한다.

 

 

오늘도 하루 잘 버텼다..

myproject.zip
0.14MB

 

 

 

읽어 주셔서 감사합니다.

728x90