AWS SDK for Java 2.x로 시작 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for Java 2.x로 시작

AWS SDK for Java 2.x는 Amazon Web Services(AWS)용 Java API를 지원합니다. SDK를 사용하면 Amazon S3, Amazon EC2, DynamoDB 등에서 작동하는 Java 애플리케이션을 쉽게 빌드할 수 있습니다.

이 자습서에서는 Apache Maven을 사용하여 Java 2.x용 SDK의 종속성을 정의한 다음 파일을 업로드하기 위해 Amazon S3에 연결하는 코드를 작성하는 방법을 보여줍니다.

자습서를 완료하려면 이 단계를 따릅니다.

1단계: 튜토리얼 설정

이 튜토리얼을 시작하기 전에 다음이 필요합니다.

  • Amazon S3 액세스 권한

  • AWS IAM Identity Center에 대한 SSO(Single Sign-On)를 사용하여 AWS 서비스에 액세스할 수 있도록 구성된 Java 개발 환경

설정 개요의 지침을 사용하여 이 자습서를 설정하세요. Java SDK에 대한 Single Sign-On 액세스로 개발 환경을 구성하고 활성 AWS 액세스 포털 세션을 설정한 후 이 자습서의 2단계를 계속 진행하세요.

2단계: 프로젝트 생성

이 자습서의 프로젝트를 생성하려면 프로젝트 구성 방법에 대한 입력을 요청하는 Maven 명령을 실행합니다. 모든 입력이 입력되고 확인되면 Maven은 pom.xml를 생성하여 프로젝트 빌드를 완료하고 스텁 Java 파일을 생성합니다.

  1. 터미널 또는 명령 프롬프트 창을 열고 원하는 디렉터리 (예: Desktop 또는 Home 폴더)로 이동합니다.

  2. 터미널에서 다음 명령을 입력하고 Enter 키를 누릅니다.

    mvn archetype:generate \ -DarchetypeGroupId=software.amazon.awssdk \ -DarchetypeArtifactId=archetype-app-quickstart \ -DarchetypeVersion=2.20.43
  3. 각 프롬프트의 두 번째 열에 나열된 값을 입력합니다.

    프롬프트 입력할 값
    Define value for property 'service': s3
    Define value for property 'httpClient': apache-client
    Define value for property 'nativeImage': false
    Define value for property 'credentialProvider' identity-center
    Define value for property 'groupId': org.example
    Define value for property 'artifactId': getstarted
    Define value for property 'version' 1.0-SNAPSHOT: <Enter>
    Define value for property 'package' org.example: <Enter>
  4. 마지막 값을 입력하면 Maven은 사용자가 선택한 항목을 나열합니다. Y을 입력하여 확인하거나 N을 입력하여 값을 다시 입력합니다.

Maven은 입력한 artifactId 값을 기반으로 이름이 getstarted로 지정된 프로젝트 폴더를 만듭니다. getstarted 폴더 안에서 검토할 수 있는 README.md 파일, pom.xml 파일, src 디렉터리를 찾으세요.

Maven은 다음과 같은 디렉터리 트리를 만듭니다.

getstarted ├── README.md ├── pom.xml └── src ├── main │   ├── java │   │   └── org │   │   └── example │   │   ├── App.java │   │   ├── DependencyFactory.java │   │   └── Handler.java │   └── resources │   └── simplelogger.properties └── test └── java └── org └── example └── HandlerTest.java 10 directories, 7 files

다음은 pom.xml 프로젝트 파일의 콘텐츠를 보여줍니다.

dependencyManagement 단원은 AWS SDK for Java 2.x대한 종속성을 포함하며 dependencies 섹션에는 Amazon S3에 대한 종속성이 있습니다. 프로젝트는 maven.compiler.sourcemaven.compiler.target 속성의 1.8 값 때문에 Java 1.8을 사용합니다.

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>getstarted</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.shade.plugin.version>3.2.1</maven.shade.plugin.version> <maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version> <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> <aws.java.sdk.version>2.20.43</aws.java.sdk.version> <-------- SDK version picked up from archetype version. <slf4j.version>1.7.28</slf4j.version> <junit5.version>5.8.1</junit5.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <-------- S3 dependency <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sso</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssooidc</artifactId> <-------- Required for identity center authentication. </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> <-------- HTTP client specified. <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Needed to adapt Apache Commons Logging used by Apache HTTP Client to Slf4j to avoid ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl during runtime --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Test Dependencies --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit5.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> </plugin> </plugins> </build> </project>

3단계: 코드 작성

다음 코드는 Maven이 생성한 App 클래스를 보여줍니다. main 메서드는 Handler 클래스의 인스턴스를 만든 다음 해당 sendRequest 메서드를 호출하는 애플리케이션의 진입점입니다.

package org.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String... args) { logger.info("Application starts"); Handler handler = new Handler(); handler.sendRequest(); logger.info("Application ends"); } }

Maven에서 만든 DependencyFactory 클래스에는 S3Client인스턴스를 빌드하고 반환하는 s3Client 팩토리 메서드가 포함되어 있습니다. S3Client 인스턴스는 Apache 기반 HTTP 클라이언트의 인스턴스를 사용합니다. 이는 Maven에서 사용할 HTTP 클라이언트를 묻는 메시지가 표시될 때 사용자가 apache-client를 지정했기 때문입니다.

DependencyFactory는 다음 코드에 나와 있습니다.

package org.example; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.s3.S3Client; /** * The module containing all dependencies required by the {@link Handler}. */ public class DependencyFactory { private DependencyFactory() {} /** * @return an instance of S3Client */ public static S3Client s3Client() { return S3Client.builder() .httpClientBuilder(ApacheHttpClient.builder()) .build(); } }

Handler 클래스에는 프로그램의 기본 로직이 들어 있습니다. App 클래스에서 Handler 인스턴스가 생성되면 DependencyFactoryS3Client 서비스 클라이언트를 제공합니다. 코드는 S3Client 인스턴스를 사용하여 Amazon S3 서비스를 호출합니다.

Maven은 TODO 주석과 함께 다음과 같은 Handler 클래스를 생성합니다. 자습서의 다음 단계에서는 TODO를 코드로 대체합니다.

package org.example; import software.amazon.awssdk.services.s3.S3Client; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { // TODO: invoking the api calls using s3Client. } }

로직을 채우려면 Handler 클래스의 전체 내용을 다음 코드로 바꾸세요. sendRequest 메서드가 채워지고 필요한 임포트가 추가됩니다.

코드는 먼저 버킷 이름을 고유하게 만들기 위해 System.currentTimeMillis()를 사용하여 생성된 이름의 마지막 부분을 사용하여 새 S3 버킷을 만듭니다.

createBucket() 메서드에서 버킷을 생성한 후 프로그램은 S3ClientputObject 메서드를 사용하여 객체를 업로드합니다. 객체의 내용은 RequestBody.fromString 메서드로 만든 간단한 문자열입니다.

마지막으로 프로그램은 cleanUp 메서드에서 객체를 삭제한 다음 버킷을 삭제합니다.

package org.example; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Exception; public class Handler { private final S3Client s3Client; public Handler() { s3Client = DependencyFactory.s3Client(); } public void sendRequest() { String bucket = "bucket" + System.currentTimeMillis(); String key = "key"; createBucket(s3Client, bucket); System.out.println("Uploading object..."); s3Client.putObject(PutObjectRequest.builder().bucket(bucket).key(key) .build(), RequestBody.fromString("Testing with the {sdk-java}")); System.out.println("Upload complete"); System.out.printf("%n"); cleanUp(s3Client, bucket, key); System.out.println("Closing the connection to {S3}"); s3Client.close(); System.out.println("Connection closed"); System.out.println("Exiting..."); } public static void createBucket(S3Client s3Client, String bucketName) { try { s3Client.createBucket(CreateBucketRequest .builder() .bucket(bucketName) .build()); System.out.println("Creating bucket: " + bucketName); s3Client.waiter().waitUntilBucketExists(HeadBucketRequest.builder() .bucket(bucketName) .build()); System.out.println(bucketName + " is ready."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } public static void cleanUp(S3Client s3Client, String bucketName, String keyName) { System.out.println("Cleaning up..."); try { System.out.println("Deleting object: " + keyName); DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucketName).key(keyName).build(); s3Client.deleteObject(deleteObjectRequest); System.out.println(keyName + " has been deleted."); System.out.println("Deleting bucket: " + bucketName); DeleteBucketRequest deleteBucketRequest = DeleteBucketRequest.builder().bucket(bucketName).build(); s3Client.deleteBucket(deleteBucketRequest); System.out.println(bucketName + " has been deleted."); System.out.printf("%n"); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } System.out.println("Cleanup complete"); System.out.printf("%n"); } }

4단계: 애플리케이션 빌드 및 실행

프로젝트가 생성되고 전체 Handler 클래스가 포함된 후 애플리케이션을 빌드하고 실행합니다.

  1. IAM IAM Identity Center 세션이 활성화되어 있는지 확인합니다. 이렇게 하려면 AWS Command Line Interface 명령 aws sts get-caller-identity을 실행하고 응답을 확인하세요. 활성 세션이 없는 경우 이 단원의 지침을 참조하세요.

  2. 터미널 또는 명령 프롬프트 창을 열고 프로젝트 디렉토리 getstarted로 이동합니다.

  3. 프로젝트를 빌드하려면 다음 명령을 사용합니다.

    mvn clean package
  4. 애플리케이션을 실행하려면 다음 명령을 사용합니다.

    mvn exec:java -Dexec.mainClass="org.example.App"

프로그램이 생성한 새 버킷과 객체를 보려면 다음 단계를 수행합니다.

  1. Handler.java에서 sendRequest 메서드의 cleanUp(s3Client, bucket, key) 줄을 주석 처리한 다음 파일을 저장합니다.

  2. mvn clean package를 실행하여 프로젝트를 다시 빌드합니다.

  3. mvn exec:java -Dexec.mainClass="org.example.App"를 다시 실행하여 텍스트 객체를 한 번 더 업로드합니다.

  4. S3 콘솔에 로그인하여 새로 생성된 버킷의 새 객체를 확인합니다.

파일을 확인한 후 객체를 삭제한 다음 버킷을 삭제합니다.

Success

Maven 프로젝트가 오류 없이 빌드되고 실행되었다면 축하합니다. Java 2.x용 SDK를 사용한 첫 Java 애플리케이션 구축에 성공했습니다.

정리

이 자습서를 진행하는 동안 생성한 리소스를 정리하려면 다음을 수행합니다.

  • 아직 삭제하지 않았다면 S3 콘솔에서 애플리케이션을 실행할 때 생성된 모든 객체와 버킷을 삭제하세요.

  • 프로젝트 폴더를 삭제합니다(getstarted).

다음 단계

이제 기본 사항을 갖추었으므로, 다음 내용을 배울 수 있습니다.