진짜 개발자
본문 바로가기

AWS/SDK & Programming

AWS SDK - JAVA를 이용해 S3에 파일 업로드시 로컬에 저장되지 않도록 하기

728x90
이번 포스팅에는 사용자의 업로드 요청시 로컬 스토리지가 아닌 AWS의 S3에 저장하는데, 로컬에는 파일이 저장되지 않은 채로 바로 업로드 하는 방법을 알아보도록 하겠습니다

이번 포스팅에는 사용자의 업로드 요청시 로컬 스토리지가 아닌 AWS의 S3에 저장하는데, 로컬에는 파일이 저장되지 않은 채로 바로 업로드 하는 방법을 알아보도록 하겠습니다.

 

 

1. AWS S3 사용법

https://galid1.tistory.com/590

S3 사용법은 이전 포스팅에서 자세히 다루었으므로 이전 포스팅을 참조해주세요.

 

 

 

2. 로컬에도 파일이 저장되는 업로드 방식

이전 포스팅에서 말씀드렸듯이 AWS S3 SDK에서 제공하는 업로드 방식은 크게 2가지 입니다. S3에 대한 세부 설정이 가능한 putObject(PutObjectRequest putObjectRequest)와 , pubOject(bucketname, key, file)입니다.

 

이전 포스팅에서는 간단히 default설정으로 저장을 하기 위해서 pubOjbect(bucketname, key, file)방식을 이용했습니다.


우선 로컬에도 파일이 저장되는 경우를 살펴보고, 로컬에 저장되지 않은채로 바로 업로드하는 방법을 알아보도록 하겠습니다.

 

위 처럼 pubObject() 메소드에 file을 매개변수로 넘겨주는 경우에는 실제 파일이 존재해야 하기 때문에 file을 create해주어야 합니다. 이 방식은 큰 문제를 가지고 있는데요. 아래에서 설명 드리겠습니다.

 

 

문제점


첫째로 파일쓰기 작업이 일어난다는 점입니다. 파일 쓰기 작업은 매우 무거운 작업입니다.

 

두번째로 업로드할 곳은 S3인데 로컬에도 파일이 저장된다는 점입니다. 이는 쓸데없는 자원을 낭비하며, 이 때문에, 별도로 file을 지우는 작업에 대한 고려를 하게됩니다.

 

 

 

3. 로컬 스토리지에 파일 저장하지 않고 업로드 하기

위의 문제점들 때문에 로컬에 저장하지 않는 방법이 필요했습니다. 


메소드를 찾아보니 매개변수로 InputStream을 받는 putObject메소드가 존재했습니다.

 

 

inputStream을 매개변수로 받는 메소드의 경우에는 마지막으로 ObjectMetadata를 추가로 받는 것을 볼 수 있습니다. 이는 InputStream을 통해 Byte만이 전달 되기 때문에, 해당 파일에 대한 정보가 없기 때문입니다. 따라서 ObjectMetadata에 파일에 대한 정보를 추가하여 매개변수로 같이 전달해야 합니다.