CLOB : 문자 대형 객체
BLOB : 이진 대형 객체(Binary)
BLOB에서 LOB 이란 Large Object의 약자로 대용량 데이터를 저장할 수 있는 데이터 타입을 말하며
B는 Binary를 뜻해 이진 대형 객체 (Binary)를 말한다.
보통 이미지, 동영상, MP3 등을 저장할 타입으로 지정한다.
웹에서 이미지는 대부분 image 태그에 url 형태로 src에 바인딩 되어 저장되는데 타부서(다른 도메인)에서 인사팀 도메인 접근 시 업무별로 권한을 따로 주게 되는데
이미지는 전체 직원이 사용하기 때문에 권한 부여시 이미지 무단 변경 및 삭제가 이루어질 수 있어 권한을 따로 추가할 수 없는 상황이었다.
타부서와 회의를 통해 이미지 데이터 저장 시 blob 타입에 Binary로 변환 후 저장시켜 다시 BASE64_ENCODE를 통해 사용할 수 있도록 조치를 취했다.
(Binary 변환 시 굉장히 긴 문자열로 생성되기 때문에 db가 무거워지는데 좀 더 상황을 파악하고 충분한 시간이 있었다면 훨씬 효율적인 방법이 있지 않았을까 싶다,,😥)
try {
//이미지 함수
Image image;
Image resizeImage;
//forMointargetFile 실제 파일이 저장되어 있는 경로
image = ImageIO.read(new File(forMointargetFile));
//이미지 사이즈 조절
resizeImage = image.getScaledInstance(70, 90, Image.SCALE_SMOOTH);
//이미지 객체 생성
BufferedImage newImage = new BufferedImage(70, 90, BufferedImage.TYPE_INT_RGB);
//이미지의 그래픽 객체
Graphics g = newImage.getGraphics();
g.drawImage(resizeImage, 0, 0, null);
g.dispose();
//이미지 출력 , 이미지를 파일출력스트림을 통해 JPG 타입으로 출력
ImageIO.write(newImage, "jpg", new File(forMointargetFile));
//예외처리
} catch (IOException e1) {
// TODO Auto-generated catch block
if(logger.isDebugEnabled() || logger.isInfoEnabled()) logger.debug("Error");
}
//[2]. 2진형태로 변환후 쿼리 날리기
try {
File file = new File(forMointargetFile);
int len;
String query;
//바이트 스트림으로 읽기위한 FileInputStream 객체
FileInputStream fis = new FileInputStream(file);
len = (int)file.length();
Connection conn = null;
//dataSource-Oracle 오라클 접속 정보가 들어있는 Bean
conn = DataSourceUtils.getConnection((DataSource) SpringContextUtil.getBean("dataSource-Oracle"));
//실제 쿼리 (조건절에 직접 파라미터를 넘기지 않고 PreparedStatement 이용해 ? 형태로 변환 가능 )
query = ("UPDATE TEST_TB SET FILE_DATA = ? WHERE TEST_COL = '" + data.get("조건 파라미터")+"'");
PreparedStatement pstmtImage = null;
try {
pstmtImage = conn.prepareStatement(query);
pstmtImage.setBinaryStream(1, fis, len);
pstmtImage.addBatch();
pstmtImage.executeBatch() ;
} catch (SQLException e) {
// TODO Auto-generated catch block
if(logger.isDebugEnabled() || logger.isInfoEnabled()) logger.debug("blob SQLException " + e.getMessage());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
if(logger.isDebugEnabled() || logger.isInfoEnabled()) logger.debug("Exception " + e.getMessage());
}