이번 포스팅에는 사용자의 업로드 요청시 로컬 스토리지가 아닌 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)
방식을 이용했습니다.
우선 로컬에도 파일이 저장되는 경우를 살펴보고, 로컬에 저장되지 않은채로 바로 업로드하는 방법을 알아보도록 하겠습니다.
xxxxxxxxxx
public void uploadFile(String uploadPath, MultipartFile multiPartFile) {
File file = new File(multiPartFile.getOriginalFilename());
try {
file.createNewFile();
simpleS3Client.getS3Client(Regions.AP_NORTHEAST_2)
.putObject("study-test-bucket", "test/file.txt", file);
} catch (IOException e) {
e.printStackTrace();
}
}
위 처럼 pubObject() 메소드에 file
을 매개변수로 넘겨주는 경우에는 실제 파일이 존재해야 하기 때문에 file을 create해주어야 합니다. 이 방식은 큰 문제를 가지고 있는데요. 아래에서 설명 드리겠습니다.
문제점
첫째로 파일쓰기 작업이 일어난다
는 점입니다. 파일 쓰기 작업은 매우 무거운 작업입니다.
두번째로 업로드할 곳은 S3인데 로컬에도 파일이 저장된다
는 점입니다. 이는 쓸데없는 자원을 낭비하며, 이 때문에, 별도로 file을 지우는 작업에 대한 고려를 하게됩니다.
3. 로컬 스토리지에 파일 저장하지 않고 업로드 하기
메소드를 찾아보니 매개변수로 InputStream
을 받는 putObject메소드가 존재했습니다.
xxxxxxxxxx
public void uploadFile(String uploadPath, MultipartFile file) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(MediaType.IMAGE_PNG_VALUE);
metadata.setContentLength(file.getSize());
try {
simpleS3Client.getS3Client(Regions.AP_NORTHEAST_2)
.putObject(
new PutObjectRequest(bucketName, uploadPath, file.getInputStream(), metadata)
.withCannedAcl(CannedAccessControlList.PublicRead)
);
} catch (IOException e) {
e.printStackTrace();
}
}
inputStream
을 매개변수로 받는 메소드의 경우에는 마지막으로 ObjectMetadata
를 추가로 받는 것을 볼 수 있습니다. 이는 InputStream
을 통해 Byte
만이 전달 되기 때문에, 해당 파일에 대한 정보가 없기 때문입니다. 따라서 ObjectMetadata
에 파일에 대한 정보를 추가하여 매개변수로 같이 전달해야 합니다.
'AWS > SDK & Programming' 카테고리의 다른 글
AWS Programming - AWS의 RDS와 springboot 연동, MysqlWorkbench와 RDS 연결하기 (RDS 한글설정) (0) | 2019.07.31 |
---|---|
AWS SDK - Java에서 AWS S3 사용하는 법 (2) | 2019.07.18 |