SpringBoot + AWS S3에 저장된 image또는 파일 Url 불러오기

Daehwan Jung·2024년 8월 27일
0

기본적인 dependency 추가 및 AWS Config 파일 등등 기타 설정은 스킵하였습니다.

취준생시절 개인프로젝트를 진행하면서서 AWS EC2도 사용하고 S3를 사용해 이미지를 관리해본 적이 있어서 초반에 개발하는데 문제가 전혀 없었다.

하지만 개발한 api response에 담긴 이미지의 url들을 확인하는데 정상적으로 이미지가 띄워지지 않았다.
어떤 이미지들은 잘 띄워지는데 특정 이미지들은 띄워지지 않았다. 근데 띄워 지지 않는 이미지들의 공통점은 이미지 파일명에 한글이나, 특수문자등이 포함되었다는 것이다.

기본적으로 AmazonS3Client Class 의 getUrl 함수를 활용하는 방법은 아래와 같다.

이미지가 저장되어있는 bucketName,과 저장된 이미지의 key값을 인자로 받으면 이미지 URL을 return하는 형식이다.

나의 경우에는 bucketName은 yml파일에 설정을 해놨고 key값은 db에 Image테이블에 저장을 해서 사용하였다.(이미지 수정,삭제,등록시 Image테이블의 관련 컬럼들이 수정 된다)

특정 이미지는 불러와지기 때문에 getUrl함수를 잘못 사용한건 아니라고 판단을 하였고
그렇다면 틀린건 key값 밖에 없으니 그 key값을 확인해 보는 과정에서 특이한 상황을 마주하게 되었다.
key값이 같은데 return 값이 다른경우였다!!!

GalleryImge라는 Entity에 imageKey값을 가져온후 print를 진행해보면

String key1 = "테스트 이미지";
String key2 = galleryImg.getImageKey();
  System.out.println(key1);
  System.out.println(key2);

테스트 이미지
테스트 이미지

이렇게 출력이 된다. 하지만

  amazonS3.getUrl(bucketName, key1);
  amazonS3.getUrl(bucketName, key2);

같은 "테스트 이미지"라는 key값으로 생성된 url이 서로 다르다...

실제로는 직접 선언한 key1 "테스트 이미지"와 mariadb에 저장된 값을 가져와서 선언한 key2"테스트 이미지" 값은 보이는건 같지만 실제 데이터는 다르다. byte단위로 쪼개서 출력을 해보면 명확한 차이를 알 수 있었다.

해결법

Normalizer.normalize("정규화를원하는 문자열", Normalizer.Form.NFD)
이미지명에 한글이나 띄어쓰기가 포함된 이미지Key값들은 정규화를 진행한뒤에 key값에 넣어서 getUrl함수를 호출하였더니 정상적으로 호출이 되었다.

Normalizer.Form.NFD는 Unicode 문자 정규화(normalization)에서 사용하는 한 가지 형태입니다. 정규화는 문자 데이터를 일관되게 표현하기 위해 사용됩니다. Unicode 표준은 다양한 방법으로 문자를 표현할 수 있기 때문에, 서로 다른 시스템이나 데이터 소스 간의 일관성을 유지하려면 정규화가 필요합니다

출처 : https://docs.aws.amazon.com/en_us/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getUrl-java.lang.String-java.lang.String-

0개의 댓글