AWS S3 SDK 버전은 1.0 버전과 2.0 버전으로 나뉘어 집니다. 인터넷에 떠도는 많은 예제 코드는 1.0 기준으로 만들어진 코드 입니다. 2.0 버전이 출시된 이상 굳이 옛 버전을 사용할 필요는 없습니다. 본 문서는 2.0 기준 입니다.
Amazon S3 ( Simple Storage Servcie ) 는 오브젝트 파일 서버 입니다. 최근에는 클라우드 서버 환경이 대세가 되면서 로컬 스토리지에 파일을 저장하는것이 아닌 오브젝트 스토리지에 파일을 저장하고 사용하는 방법을 많이 선호하고 있습니다. 다만 사용하기 위해서는 아마존 클라우드 서비스의 기본 지식을 알아야 합니다. 처음부터 하나씩 차근차근 사용하는 방법을 배워 봅시다. 참고로 이 버전은 서버용 java sdk 입니다. 안드로이드 버전은 따로 있습니다.
준비물
AWS 계정
진행 순서
1. AWS S3 버킷 생성
2. IAM Access Key 생성
3. Access Key 세팅
4. Sample Project 생성
5. Gradle ( Maven ) 에서 의존성 추가
6. 샘플 코드 작성 ( 업로드, 다운로드, 삭제 구현 )
AWS 에 로그인 한 뒤 S3 Console 으로 이동 합니다.
https://s3.console.aws.amazon.com/
"버킷 만들기" 버튼을 클릭하여 버킷을 생성 합니다.
이후 버킷 만들기를 클릭 하면 버킷이 생성 됩니다.
버킷이 정상적으로 생성 된것을 확인할 수 있습니다. 여기서 직접 파일을 업로드 할 수도 있습니다.
IAM 은 AWS 에 존재하는 수 많은 서비스에 접근할 수 있는 키를 생성 및 관리하고 권한을 설정 할 수 있는 서비스 입니다. 아래 링크를 클릭하여 IAM Console 페이지로 이동 합니다.
https://console.aws.amazon.com/iam
사용자 탭으로 이동 합니다.
사용자를 추가 합니다.
사용자 이름 : 원하시는 이름을 입력 합니다.
엑세스 유형
일단 우리는 Amazon S3 SDK 2.0 for Java 를 간단히 진행할 계획이기 때문에 프로그래밍 방식 엑세스를 선택하고 다음을 선택 합니다.
그다음 이 사용자에 대한 권한을 설정하는 페이지 입니다. 우리는 Amazon S3 를 사용할 것이기 때문에 다른 권한은 필요가 없습니다. 그러므로 위 사진과 같이 AmazonS3FullAccess 를 선택합니다. 세부적으로 권한을 설정 하고 싶다면 따로 설정 하셔도 됩니다. 다음을 선택 합니다.
태그를 입력하는 곳입니다. 지금 쓸 일이 없으니 그냥 넘어 가도록 합니다.
사용자 만들기 버튼을 누르게 되면 완료 됩니다.
엑세스 키 ID 와 비밀 엑세스 키를 볼 수 있습니다. 비밀 엑세스 키는 다시 얻을수 없으니 잘 보관하셔야 합니다.
이제 2 번에서 획득한 Access Key ID 와 Access secret key 를 세팅 할 차례 입니다.
자세한 사항은 https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/setup-credentials.html 링크를 참고 하세요.
credentials
[default]
aws_access_key_id = 엑세스키 아이디 입력
aws_secret_access_key = 엑세스 시크릿 키 입력
저장 경로
~/.aws/credentials
on Linux, macOS, or Unix
C:\Users\USERNAME.aws\credentials
on Windows
위 경로에 파일을 만들어서 저장 합니다. 만약 위 파일을 세팅하지 않으면 AWS SDK 에서 client 을 불러 올때 null 이 발생하므로 반드시 세팅을 해주셔야 합니다.
샘플 프로젝트를 생성해 보도록 하겠습니다.
Intellij Ultimate 를 사용 했으며 어떤 툴을 써도 크게 상관은 없습니다. Create New Project 를 선택 합니다.
Spring Initializr 를 선택 합니다. 굳이 스프링 프로젝트일 필요는 없습니다만, 귀찮은 세팅을 피하기 위해서 스프링으로 생성 했습니다.
저는 Gradle 을 주로 사용하기 때문에 Gradle 을 선택 했습니다. Maven 을 사용하셔도 무방 합니다.
의존성은 Web만 추가 했습니다.
위에 언급한 대로 AWS SDK for Java 는 1.0 버전과 2.0 버전이 있습니다. 본 문서는 최신 버전인 2.0 버전을 기준으로 설명 합니다. 자세한 정보는 https://aws.amazon.com/ko/sdk-for-java/ 링크를 참고 하세요.
AWS S3 SDK 2.0 for Java 가 업데이트 되는 공식 github 주소 입니다. 자세한 정보는 아래 링크를 확인하세요.
https://github.com/aws/aws-sdk-java-v2
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.13.0</version>
</dependency>
근데 해당 github 주소로 들어가 보니 Maven 의존성 추가는 설명이 되어 있는데 gradle 의존성은 나와 있지 않네요. 사용하지 못하는 것일까요? 그런데 큰 상관 없습니다. 어차피 Maven 과 Gradle 은 같은 저장소를 공유하고 있기 때문에 Maven 에서 사용할 수 있는 의존성은 Gradle 에서도 사용할 수 있습니다.
Maven 을 쓰실 계획이시라면 위 처럼 그대로 쓰시면 되고, Gradle 으로 쓰실꺼면 다음과 같이 사용 하면 됩니다. 포스팅 기준 가장 최신버전을 적용 했으며, 굳이 옛날 버전을 사용할 필요는 없습니다.
dependencies {
implementation "software.amazon.awssdk:s3:2.13.0"
...
}
버전 정보를 확인하고 싶으시면 https://mvnrepository.com/artifact/software.amazon.awssdk/s3 으로 접속 하시면 됩니다.
그리고 빌드를 진행하면 위 이미지 처럼 의존성이 제대로 추가가 된 것을 확인할 수 있습니다.
이제 사전 준비는 다 끝났습니다. 직접 코드로 작성만 남았습니다. 샘플 코드는 아마존 S3 공식 사이트를 참고 하였습니다. https://docs.aws.amazon.com/ko_kr/sdk-for-java/v2/developer-guide/examples-s3-objects.html
업로드를 테스트 하기 위하여 인터넷에서 적당한 이미지를 가져와서 resource/static
경로에 복사 합니다.
샘플 코드
AmazonS3Service.java
https://github.com/reedfoxy/demo-aws-s3-sdk-for-java/blob/master/src/main/java/com/example/amazons3sdksample/AmazonS3Service.java
샘플 테스트 코드
AmazonS3SdkSampleApplicationTests
https://github.com/reedfoxy/demo-aws-s3-sdk-for-java/blob/master/src/test/java/com/example/amazons3sdksample/AmazonS3SdkSampleApplicationTests.java
사용 방법은 매우 간단 합니다. 메소드는 upload 와 delete 로 구현 했으며 주석을 보면 이해하는데 어렵지 않을 것 입니다.
위 순서대로 잘 따라 오셨다면 정상적으로 파일이 업로드 된것을 확인하실 수 있습니다.
아래는 전체 예제 코드 github 주소 입니다.
https://github.com/reedfoxy/demo-aws-s3-sdk-for-java