본문으로 바로가기

VO 코드 (1)

@Data
public class GaleryInfoDto {

    // ... 생략 ...

    // 핵심 1
    private MultipartFile imageObject;         //이미지_객체

    // 핵심 2
    private String imageCn;                    //이미지_내용 (바이너리 코드 -> escape)
    private String imageAt;                    //이미지_여부 (R/M/D)_ Read/Merge/Delete
}

 

VO 코드 (2)

@Data
public class GaleryInfoImgDto {

    // ... 생략 ...
    private String imageFileNm;    //이미지_파일_명
    private double imageFileMg;    //이미지_파일_크기
    private byte[] imageCn;        //이미지_내용 (바이너리 코드)
}

 

 

GaleryInfoImgDto 정보를 insert 할 DB 테이블

 

 

서비스 계층의 JAVA 코드

// 사용하는 패키지 import org.jasypt.contrib.org.apache.commons.codec_1_3.binary.Base64;
// 해당 패키지는 jasypt-{버전}.jar 에 있다. Base64 encoding 은 다양한 방법으로 생성할 수 있다! 구글링하자.

@Override
public int modifyGaleryInfo(GaleryInfoDto galeryInfoDto) {

    GaleryInfoImgDto galeryInfoImgDto = new GaleryInfoImgDto();
    galeryInfoImgDto.setId(galeryInfoDto.getId());
    String imageAt = galeryInfoDto.getImageAt();

    try {
        // dataURL String 생성하기
        byte[] encodeBase64 = Base64.encodeBase64(galeryInfoDto.getImageObject().getBytes());
        String binaryString = "data:image/png;base64," + new String(encodeBase64, "UTF-8"); // 실제 data url 생성!

        // DTO 생성
        MultipartFile imageObject = galeryInfoDto.getImageObject();
        galeryInfoImgDto.setImageCn(binaryString.getBytes());
        galeryInfoImgDto.setImageFileNm(imageObject.getOriginalFilename());
        galeryInfoImgDto.setImageFileMg(imageObject.getSize());

        // myBatis 쿼리 호출
        commonDAO.update("GaleryDao.mergeGaleryImg", galeryInfoImgDto);
    } catch (IOException e) {
        e.printStackTrace();
    }

    ///...  생략 ...

}

 

 

MyBatis 쿼리

<!--이미지(썸네일) 병합(= 등록 + 수정 ) 쿼리 -->
<update id="mergeGaleryImg">
  INSERT INTO 
    테이블명
    (ID, IMAGE_FILE_NM, IMAGE_FILE_MG, IMAGE_CN)
  VALUES(#{id}, #{imageFileNm}, #{imageFileMg}, #{imageCn})
  ON CONFLICT(ID)
  DO UPDATE
  SET 
    IMAGE_FILE_NM = #{imageFileNm},
    IMAGE_FILE_MG = #{imageFileMg},
    IMAGE_CN = #{imageCn},
</update>

참고로 ON CONFLICT 는 오라클의 MERGE의 PostGreSql 버전이다.

 

주의

ps. 그런데 파일의 크기가 너무 커지면 byte[] encodeBase 에서 memory 사용율이 너무 높아질 수 있다.

그러니 브라우저 및 서버에서 파일의 크기 제한 및 검사를 해주는게 좋다.

가장 이상적인 것은 그냥 아예 dataUrl 방식을 쓰지 말고, 썸네일을 생성해주는 라이브러리를 갖다가 쓰는 것이다.