본문 바로가기
Java

[Spring Boot] AWS S3 업로드 하는 법

by parkjp 2023. 8. 11.

 

 

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 호출로 직접 업로드를 할 수 있다.

 

간단하다 끗~

반응형