해당 포스팅은 사이드 프로젝트 진행 중 겪은 크고 작은 이슈들에 대한 기록입니다.
AWS의 CloudFront의 기능 중 하나로 애플리케이션의 사용자에게 더 가까운 위치에서 코드를 실행하여 성능을 개선하고 지연 시간을 단축할 수 있게 해줍니다. (AWS Lambda@Edge 소개글)
Imgscarl
라이브러리를 선택하였다./*
build.gradle 추가
Imgscalr 이미지 리사이징 라이브러리
https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib
*/
implementation group: 'org.imgscalr', name: 'imgscalr-lib', version: '4.2'
/*
이미지 리사이징 메소드
*/
public static MultipartFile getResizedMultipartFile(MultipartFile multipartFile, String originalFileName) throws IOException {
final int TARGET_IMAGE_WIDTH = 420;
final int TARGET_IMAGE_HEIGHT = 200;
final String TARGET_IMAGE_TYPE = "jpg";
BufferedImage bi = ImageIO.read(multipartFile.getInputStream());
bi = resizeImages(bi, TARGET_IMAGE_WIDTH, TARGET_IMAGE_HEIGHT);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, TARGET_IMAGE_TYPE, baos);
baos.flush();
// MultipartFile 인터페이스를 구현한 구현체를 통해 MultipartFile을 생성해줌
return new CustomMultipartFile(baos.toByteArray(), multipartFile.getName(), originalFileName, TARGET_IMAGE_TYPE, false, baos.toByteArray().length);
}
private static BufferedImage resizeImages(BufferedImage originalImage, int width, int height) {
return Scalr.resize(originalImage, width, height);
}
org.springframework.mock.web.MockMultipartFile
를 사용해도 되는 것 같은데, 이는 너무 Spring에 의존되는 방법이라 구현체를 만들기로 결정하였다.import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/*
MultipartFile을 생성하기 위해
MultipartFile 인터페이스를 상속받은 클래스
*/
public class CustomMultipartFile implements MultipartFile {
private final byte[] bytes;
private final String name;
private final String originalFilename;
private final String contentType;
private final boolean isEmpty;
private final long size;
public CustomMultipartFile(byte[] bytes, String name, String originalFilename, String contentType, boolean isEmpty, long size) {
this.bytes = bytes;
this.name = name;
this.originalFilename = originalFilename;
this.contentType = contentType;
this.isEmpty = isEmpty;
this.size = size;
}
@Override
public String getName() {
return name;
}
@Override
public String getOriginalFilename() {
return originalFilename;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public boolean isEmpty() {
return isEmpty;
}
@Override
public long getSize() {
return size;
}
@Override
public byte[] getBytes() throws IOException {
return bytes;
}
@Override
public InputStream getInputStream() throws IOException {
return null;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
}
}
/*
이미지 리사이징
*/
// 위는 생략...
MultipartFile resizedMultipartFile = getResizedMultipartFile(multipartFile, originalFileName);
File uploadFile = convert(resizedMultipartFile).orElseThrow(
() -> new IllegalArgumentException("전환 실패"));
imageUrl = getImageUrl(uploadFile, storeFileName);
}
return new UploadFile(originalFileName, storeFileName, imageUrl);
}