원래는 서버에 클라이언트가 Formdata 형태로 이미지 파일을 전달하고, 서버에서는 로컬에 해당 이미지를 저장해 File로 변환 후 s3 client를 이용해 버킷에 객체(이미지)를 업로드 하는 방식을 썼었다.
fun convertMultipartToFile(multipartFile: MultipartFile): File {
val convertedFile = File(System.getProperty("user.dir") + "/" + multipartFile.originalFilename)
if (convertedFile.createNewFile()) {
val fos = FileOutputStream(convertedFile)
fos.write(multipartFile.bytes)
return convertedFile
}
throw IllegalStateException("파일 변환 실패")
}
여기서 반환된 File을 s3Client의 putObject를 이용해 업로드 했었다.
여러 토이프로젝트에서 사용하는 방법이고, 나도 그동안 api를 개발하면서 항상 이 방식을 썼었다.
이전 글에서 나타난 문제는 바로
iOS 기기에서는 이미지 크기 리사이징이 자동으로 되지 않아서, 파일의 크기가 너무커져 nginx단에서 요청을 거부하는 것이었다.
앱 서버를 거쳐야하는 이유는 하나도 없었다. 근본적인 문제를 알게 된 이상 계속 이 방법을 쓰면 안된다고 생각했다.
여기서두 s3에 원본 업로드 하고, 그 이벤트를 트리거로 삼는 lambda에서 리사이징을 하도록 했다.
많은 해결방법들 중, 나는 presigned url을 사용하기로 했다.
그래서 회사 분들에게 물어봤더니 멘토분에게 5초만에 답이 달렸다 .. 최고
바로 도입!
본 포스팅에서는 presigned url이 뭔지는 얘기 안함
AWS 문서 를 보면 이렇게 써있다.
클라이언트에서 람다에게 사진 업로드 요청을 보낼 presigned url을 얻어서 직접 사진을 업로드 한다.
앱 서버는 이미 업로드된 사진의 url을 직접 받아 데이터베이스에 저장하기만 하면 된다.
하휴, 진작 이렇게 할걸ㄹ
와 로지 람다도 써보셨나요??