멋사 Backend Plus 프로젝트 디벨롭 🦁

신재원·2023년 12월 31일

멋사 백엔드 심화 과정이 끝나고, 피드백을 받았던 내용을 프로젝트에 적용하였다.

피드백

프로젝트에서 받았던 피드백은 다음과 같았다.

Q : AWS S3 버킷에 이미지를 등록할때 최적화를 생각 하셨나요?

A : 아뇨 S3 버킷에 이미지를 등록할때 최적화는 생각하지 못했고, S3 버킷에 이미지가 업로드 되는 것만 확인 했습니다.

Q : 이미지를 등록할때 이미지를 "리사이징" 해서 등록해서 이미지를 조회 하게 되면 성능상 이점이 있습니다. ~~등등등


프로젝트에서 AWS S3 버킷에 이미지를 등록하는 기능을 내가 맡았고,
질문에 대한 대답 또한 내가 하였다.

이미지 리사이징

이미지 리사이징 이란 ?

간단하게 설명 하자면, 이미지 즉 사진의 크기를 코드를 통해 조절하는 것 입니다.

문서를 찾아보며 이미지 리사이징 하는 방법이 여럿 존재 했습니다.

  1. Marvin 라이브러리
  2. Thumbnailator 라이브러리
  3. AWS 람다를 사용하여 이미지 리사이징
    등등

Marvin 라이브러리를 사용하기 위해서는 아래와 같은 의존성을 추가 해야 합니다.

implementation 'com.github.downgoon:marvin:1.5.5'
implementation 'com.github.downgoon:MarvinPlugins:1.5.5'

Marvin 라이브러리를 사용해서 이미지를 리사이징 하는 자료들이 많았지만, 진행하던 프로젝트에서 Marvin 관련 의존성을 추가하게 되면
아래와 같은 에러 코드가 발생해서 Marvin 라이브러리를 사용하지 못햇습니다.
(해당 에러는 콘솔에 log(로그) 출력이 너무 길게 되어 발생한 에러)

Spring Boot 에서 이미지 리사이징하여 AWS S3 버킷에 저장하기

  • Thumbnailator 라이브러리를 사용해서 이미지 리사이징을 진행 하였습니다.

1. 원본 이미지를 등록할 버킷과 리사이징할 이미지를 등록할 버킷을 분리해서 생성하기

S3 버킷을 만드는 방법은 저번 블로그로 대체 하겠습니다.

2. Thumbnailator 라이브러리 사용

Thumbnailator라이브러리를 사용하기 위해서는 아래의 의존성을 추가 해줘야 합니다.

implementation 'net.coobird:thumbnailator:0.4.19'

이미지를 리사이징 하는 메소드 입니다.

private void createS3Bucket(String bucketName, String fileName, MultipartFile image) throws IOException {
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentType(image.getContentType());

    // 이미지 리사이징
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    // 너비와 높이를 400, 400으로 리사이징 합니다.
    Thumbnails.of(image.getInputStream()).size(400, 400).toOutputStream(outputStream);
    byte[] buffer = outputStream.toByteArray();

    metadata.setContentLength(buffer.length);
    ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);

    // 리사이징된 이미지를 bucketName파라미터를 통해 리사이즈 버킷에 저장
    amazonS3Client.putObject(bucketName, fileName, inputStream, metadata);
}

이미지를 리사이징을 안했을 경우

이미지를 리사이징 했을 경우

이미지를 리사이징 했을경우 버킷에 저장되는 크기 즉 용량이 조절 되므로, 이미지 관련해서 조회를 했을경우 성능상 이점을 얻을 수 있을 것 이다.

마무리

프로젝트에 대한 피드백을 받고, 피드백에 맞는 결과물을 도출하기까지의 과정이 너무 재밌었다.
부족했던 부분을 채울 수 있었고 실제로 프로젝트에 적용까지 되니까 좋았다.

0개의 댓글