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 방식을 쓰지 말고, 썸네일을 생성해주는 라이브러리를 갖다가 쓰는 것이다.