대부분의 데이터베이스에서 이제 Statement의 setObject(), ResultSet의 getObject() 메소드를 이용하여 자바 객체에 대한 저장을 지원하고 있습니다.
MySQL도 마찬가지인데 저장할 때는 다음과 같이 저장을 해도 별반 문제가 되지 않습니다.
public void insertDataAsObject(String txId, AgentTransactionData data) throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
StringBuffer query = new StringBuffer();
query.append("INSERT INTO M_REQUEST_OBJ_DATA_TBL(TX_ID, DATA_OBJ) VALUES (?, ?)");
pstmt = conn.prepareStatement(query.toString());
pstmt.setString(1, txId);
pstmt.setObject(2, data);
pstmt.execute();
} catch (Exception e) {
throw e;
} finally {
close(pstmt);
close(conn);
}
}
setObject 메소드가 없을 당시에는 다음과 같이 처리를 하고 있었습니다.
pstmt = conn.prepareStatement(query.toString()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oout = new ObjectOutputStream(baos); oout.writeObject(data); oout.close(); pstmt.setString(1, txId); //pstmt.setBytes(2, baos.toByteArray());
현재 JDBC Driver를 이용할 경우 기본 설정만으로도 저장은 첫번째 자바코드처럼 아주 심플하게 끝납니다. 얻어오는 경우는 어떻게 될까요?
ResultSet rset = stmt.executeQuery("SELECT TX_ID, DATA_OBJ FROM M_REQUEST_OBJ_DATA_TBL");
while( rset.next() ) {
System.out.println(rset.getString(1) + "/");
AgentTransactionData tt = (AgentTransactionData) rset.getObject(2);
}
당연히 위처럼 사용하면 데이터가 나와야 되는데 어찌된 일인지 나오지를 않습니다. System.out.println(tt.getClass().getName()); 코드로 결과값을 찍어봐야 [B 라는 문자를 찍는 게 끝입니다.
열심히 찾아봤더니 JDBC 연결 문자열에 "autoDeserialize=true" 옵션을 추가해주어야 합니다.
만약 관리자가 위의 문자열 추가를 해주지 못하는 경우 프로그램을 아래와 같이 변경하여야 합니다.
Statement stmt = con.createStatement();
//stmt.executeUpdate("SELECT TX_ID, DATA_OBJ FROM M_REQUEST_OBJ_DATA_TBL");
ResultSet rset = stmt.executeQuery("SELECT TX_ID, DATA_OBJ FROM M_REQUEST_OBJ_DATA_TBL");
while( rset.next() ) {
System.out.println(rset.getString(1) + "/");
byte[] buf = rset.getBytes(2);
if (buf != null) {
ObjectInputStream objectIn = new ObjectInputStream(
new ByteArrayInputStream(buf));
AgentTransactionData obj = (AgentTransactionData) objectIn.readObject();
System.out.println(obj);
}
}
월요일 아침에 슬며시 삽질한 내용이었습니다.





