1. 업로드를 위한 AWS S3 dependency 추가
업로드를 하기위해서 dependency를 추가해보자.
dependencies {
implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.12.232'
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
}
2. 업로드 Request
간단하게 파일 업로드 예시를 만들어 보자.
bucket 이름과 accessKey, SecretKey는 따로 yml파일에 설정해 둔다.
@Component
public class AwsS3 {
private final Regions REGION = Regions.AP_NORTHEAST_2;
private final AmazonS3 s3Client;
@Value("${aws.s3.bucket}")
private String bucketName;
public AwsS3(@Value(value = "${aws.access.key}") String accessKey, @Value(value = "${aws.access.secret}") String secret) {
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secret);
s3Client = AmazonS3ClientBuilder.standard().withRegion(REGION).withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
}
public PutObjectResult uploadFile(String filename, MultipartFile file) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.getBytes().length);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, filename, file.getInputStream(), metadata);
return s3Client.putObject(putObjectRequest);
}
}
UploadFile함수에서 filename은 버킷의 경로도 포함된다.
예를 들어, filename을 "test/test.jpg"로 한다면 bucket안에 test폴더 안에 test.jpg파일이 저장된다.
하지만 서버에서 업로드를 진행한다면 큰 파일을 올릴 시 heap 메모리가 부족할 수 있다.
서버에서 바로 올리는 것 외에도 Pre-signed URL을 만들어서 클라이언트에서 올리는 방법도 있다.
3. Pre-Signed URL
upload를 할 수 있는 pre-signed URL을 만들어보자.
public URL preSignedUrl(String fileName) {
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileName);
request.setExpiration(Date.from(Instant.now().plus(60, ChronoUnit.SECONDS)));
request.setMethod(HttpMethod.PUT);
return s3Client.generatePresignedUrl(request);
}
위 예제에서는 60초 동안 업로드를 할 수 있는 Pre-Signed URL을 만들었다.
이 URL을 클라이언트에게 Response에 담아 주고 클라이언트는 이 URL로 PUT 호출로 직접 업로드를 할 수 있다.
간단하다 끗~
반응형
'Java' 카테고리의 다른 글
Try-with-resources를 이용한 자원 해제 처리 (0) | 2023.08.19 |
---|---|
[Spring Boot] jib로 AWS ECR에 docker image 올리기 (0) | 2023.08.14 |
[Spring Boot] SSE(Server-Sent-Event) 설정, 사용법을 알아보자! (0) | 2023.08.10 |
[Spring Boot] Redis Pub/Sub 설정 및 사용법!! (0) | 2023.08.09 |
[Spring Boot] Logging 설정하기 (로그 설정) (0) | 2023.07.21 |