이미지를 BLOB 형태로 DB에 저장하기
요즘은 잘 사용하지 않는 방식이지만, DB 컬럼에 이미지나 파일을 저장하는 경우가 있다. 아무래도 자주 사용되는 방식도 아니고, MyBatis를 이용해 데이터를 삽입하는 방법은 나도 잘 몰랐기 때문에 포스팅해본다.
주요 로직은 아래와 같다.
1. 서비스단에서 주어진 파일 경로를 바탕으로 파일 객체를 만든다.
2. 파일 객체로 이미지를 byte 배열 형태로 변환한다.
3. MyBatis를 통해 데이터를 삽입, 수정한다.
위 로직을 보았을 때 한 가지 의문점이 생길 수도 있다. DB 컬럽 타입은 BLOB인데 왜 byte 배열로 변환하는것일까? 이유는 MyBatis의 typeHandlers에 있다. 아래 사진을 보면 알 수 있듯이, Java의 byte[]을 JDBC의 BLOB 타입으로의 매핑이 자동으로 지원된다. 아래 링크를 열어보면 이러한 타입 핸들링 정보가 있다.
(http://www.mybatis.org/mybatis-3/ko/configuration.html)
우선, 가장 중요한 이미지를 byte[]로 변환하는 메서드를 작성해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public static byte[] imageToByteArray (String filePath) throws Exception { byte[] returnValue = null; ByteArrayOutputStream baos = null; FileInputStream fis = null; try { baos = new ByteArrayOutputStream(); fis = new FileInputStream(filePath); byte[] buf = new byte[1024]; int read = 0; while ((read=fis.read(buf, 0, buf.length)) != -1) { baos.write(buf, 0, read); } returnValue = baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { if (baos != null) { baos.close(); } if (fis != null) { fis.close(); } } return returnValue; } | cs |
이 메서드를 이용해 서비스단에서 DAO 메서드를 호출하기 전에 값을 변환해 파라미터에 추가해주자.
1 2 3 4 5 6 7 8 | public void saveList (HashMap param) { byte[] image = Utils.imageToByteArray("D:/fakePath/imaage.jpg"); param.put("IMAGE", image); dao.insertList(param); } | cs |
그리고 DAO에서 데이터를 insert하는 쿼리 XML을 작성해보자. 이 때 주의해야할 점이 있는데, BLOB의 INSERT, UPDATE시에는 서브쿼리나 MERGE문을 사용하지 못한다. 만약 사용해야한다면 이러한 분기처리는 서비스단에서 해주도록 하자.
1 2 3 4 5 6 7 8 9 10 | <insert id="saveList" parameterType="java.util.Map"> INSERT INTO TEST_TABLE ( IMAGE ) VALUES ( #{IMAGE} ) </insert> | cs |
이렇게 이미지를 DB의 BLOB 컬럼에 저장할 수 있다.
마지막으로 중요한 포인트를 다시 정리해보자.
DAO 호출 전에 이미지를 byte[] 로 변환한다.
MyBatis에서 Java의 byte[]은 JDBC의 BLOB 타입으로의 매핑이 자동으로 지원된다.
BLOB의 INSERT, UPDATE시에는 서브쿼리나 MERGE문을 사용하지 못한다.
'☕️ JAVA' 카테고리의 다른 글
WebSocketSession에서 HttpSession를 얻는 방법 (0) | 2020.09.10 |
---|---|
Spring AOP와 AspectJ 비교하기 (14) | 2019.12.15 |
웹 서버와 웹 어플리케이션 서버의 차이 (1) | 2017.12.22 |
예외(Exception) - 잘못된 처리들 (0) | 2017.12.04 |
[이펙티브자바] 규칙05 : 불필요한 객체는 만들지 말라 (0) | 2017.10.10 |