자바 blob 이미지 저장

남기현·2022년 4월 5일
0
post-thumbnail

📌CLOB BLOB

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());
}
profile
내가 보려고 만든 velog

0개의 댓글