1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

이미지를 BLOB 형태로 DB에 저장하기
☕️ JAVA

이미지를 BLOB 형태로 DB에 저장하기

2018. 9. 9. 15:08

이미지를 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;
}
Colored by Color Scripter
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);
}
Colored by Color Scripter
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>
Colored by Color Scripter
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
    '☕️ JAVA' 카테고리의 다른 글
    • WebSocketSession에서 HttpSession를 얻는 방법
    • Spring AOP와 AspectJ 비교하기
    • 웹 서버와 웹 어플리케이션 서버의 차이
    • 예외(Exception) - 잘못된 처리들
    1HOON
    1HOON

    티스토리툴바