Java에서 AWS S3로 파일 업로드

K PizzaCola·2021년 6월 23일
2

Cloud

목록 보기
3/3
post-thumbnail

개요

Java에서 AWS S3로 이미지 업로드 하는 방법을 정리한다.

AWS SDK for Java 2.x

AWS SDK for Java 2.x은 Netty 기반으로 작성되어 Nonblocking I/O, 등등 기타 좋은 점들이 있는 SDK이다. Java 버전은 1.8버전 이상을 요구한다.

의존성

Gradle이면 다음과 같이 사용한다. 최신버전은 2.16.88? 인듯 하다.

dependencies {
  ...
  implementation platform('software.amazon.awssdk:bom:2.15.0')
  implementation 'software.amazon.awssdk:s3control'
  ...
}

공식 문서에는 awssdk:kinesis라 되어있지만, 여기서는 S3에 접근할 것이므로 awssdk:s3control을 사용한다.

Maven은 공식문서를 참고

S3Client

이후는 간단하다. S3Client에 credential 정보를 넣고, 원하는 형태로 사용하면 된다. 굳이 S3가 아니더라도, 다른 서비스를 이용하려면 ~~Client를 가져오고, credential 정보를 추가하여 build를 한 후에 사용한다.

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/creating-clients.html

S3Client client = S3Client.builder()
	.region(Region.AP_SOUTHEAST_2)
    	.credentialsProvider(ProfileCredentialsProvider.create("profile_name"))
        .build();

참고로, Client는 Thread-safe하고, long-lived objects로 사용할 수 있으며, AutoClosable 인터페이스를 구현했기 때문에, Spring Bean으로 등록하여 사용해도 괜찮다.

또한 AWS의 EC2에서 실행한다면, EC2 Instance에 IAM Role을 부여하여 사용하는 것이 좋다. 이 경우라면, 단순히 client.create()로 사용해도 좋고, InstanceProfileCredentialsProvider를 사용해서 provider chain을 패스해서 바로 role을 사용할 수 있다.

다음은 빈으로 등록하여 사용하는 예제이다.

@Bean
public S3Client client() {
	return S3Client.create();
}

@Bean
public S3Client client() {
	return S3Client.builder()
              .credentialsProvider(InstanceProfileCredentialsProvider.builder().build())
              .build();
}

그 외에 profile이나 access key등을 이용하는 방법은 Using credentials를 참고한다.

Object Upload

좀 더 자세한 자료는 https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-s3.html 를 참고한다.

S3에 객체를 업로드 하려면 먼저 요청에 대한 정보를 구성한다. 요청 바디로는 ByteBuffer, File, InputStream 등등 여러가지를 이용할 수 있다. Spring MVC에서 MultipartFile을 이용하여 파일을 받는다면, 여기서 InputStream을 가져와서 업로드할 수 있겠다.

아래 예제는 MultipartFile에서 S3로 Object를 업로드한다.


// DI 받거나, 만들거나 원하는대로 한다.
private S3Client client;

public void upload(MultipartFile multipartFile) throws IOException {
    // 요청 구성
    PutObjectRequest putObjectRequest = PutObjectRequest.builder()
        .bucket("bucketName")
        .key("objectKey")
        .build();
    // 요청 바디 구성
    RequestBody requestBody = RequestBody
    	.fromInputStream(multipartFile.getInputStream(), multipartFile.getSize());
    
    client.putObject(putObjectRequest, requestBody);
}

끝맺음

여기까지 AWS SDK for Java 2.x를 이용하여 파일을 S3에 업로드했다. 이 글을 작성한 이유는 Spring boot 2.4.0M1 이후 버전을 이용하면 Spring Cloud AWS starter를 start.spring.io에서 추가할 수 없기도 했고, Spring Cloud AWS 2.3이 AWS SDK for Java 2.x를 아직 지원하지 않는 등의 이유가 있기 때문이었다. 단순한 파일 업로드 외에 여러가지 기능을 사용하고 싶다면 Code examples for the AWS SDK for Java 2.x를 참고하기 바란다.

참고자료

profile
공부하는 개발자입니다.

0개의 댓글