

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

# 를 사용하여 간단한 애플리케이션 생성 AWS SDK for Java 2.x
<a name="get-started-tutorial"></a>

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

자습서를 완료하려면 이 단계를 따릅니다.
+  [1단계: 튜토리얼 설정](#get-started-setup) 
+  [2단계: 프로젝트 생성](#get-started-projectsetup) 
+  [3단계: 코드 작성](#get-started-code) 
+  [4단계: 애플리케이션 빌드 및 실행](#get-started-run) 

## 1단계: 튜토리얼 설정
<a name="get-started-setup"></a>

이 튜토리얼을 시작하기 전에 다음이 필요합니다.
+ 액세스 권한 Amazon S3
+ 에 대한 Single Sign-On을 AWS 서비스 사용하여에 액세스하도록 구성된 Java 개발 환경 AWS IAM Identity Center

[설정 개요](setup.md#setup-overview)의 지침을 사용하여 이 자습서를 설정하세요. Java SDK에 대한 [Single Sign-On 액세스로 개발 환경을 구성](get-started-auth.md#setup-credentials)하고 [활성 AWS 액세스 포털 세션](get-started-auth.md#setup-login-sso)이 있으면이 자습서의 2단계를 계속 진행합니다.

## 2단계: 프로젝트 생성
<a name="get-started-projectsetup"></a>

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

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

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

   ```
   mvn archetype:generate \
     -DarchetypeGroupId=software.amazon.awssdk \
     -DarchetypeArtifactId=archetype-app-quickstart \
     -DarchetypeVersion=2.27.21
   ```

1. 각 프롬프트의 두 번째 열에 나열된 값을 입력합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/get-started-tutorial.html)

1. 마지막 값을 입력하면 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` 프로젝트 파일의 콘텐츠를 보여줍니다.

### `pom.xml`
<a name="projectsetup-collapse2"></a>

`dependencyManagement` 단원은 AWS SDK for Java 2.x 대한 종속성을 포함하며 `dependencies` 섹션에는 Amazon S3에 대한 종속성이 있습니다. 프로젝트는 `maven.compiler.source` 및 `maven.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.27.21</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단계: 코드 작성
<a name="get-started-code"></a>

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

### `App` 클래스
<a name="projectsetup-collapse2"></a>

```
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` 클래스에는 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html) 인스턴스를 빌드하고 반환하는 `s3Client` 팩토리 메서드가 포함되어 있습니다. `S3Client` 인스턴스는 Apache 기반 HTTP 클라이언트의 인스턴스를 사용합니다. 이는 Maven에서 사용할 HTTP 클라이언트를 묻는 메시지가 표시될 때 사용자가 `apache-client`를 지정했기 때문입니다.

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

### `DependencyFactory` 클래스
<a name="code-collapse2"></a>

```
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` 인스턴스가 생성되면 `DependencyFactory`는 `S3Client` 서비스 클라이언트를 제공합니다. 코드는 `S3Client` 인스턴스를 사용하여 Amazon S3 서비스를 호출합니다.

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

### Maven에서 생성한 `Handler` 클래스
<a name="code-collapsible3"></a>

```
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` 메서드가 채워지고 필요한 임포트가 추가됩니다.

### `Handler` 클래스 구현됨
<a name="code-collapse4"></a>

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

`createBucket()` 메서드에서 버킷을 생성한 후 프로그램은 `S3Client`의 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#putObject(software.amazon.awssdk.services.s3.model.PutObjectRequest,software.amazon.awssdk.core.sync.RequestBody)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#putObject(software.amazon.awssdk.services.s3.model.PutObjectRequest,software.amazon.awssdk.core.sync.RequestBody)) 메서드를 사용하여 객체를 업로드합니다. 객체의 내용은 `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단계: 애플리케이션 빌드 및 실행
<a name="get-started-run"></a>

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

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

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

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

   ```
   mvn clean package
   ```

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

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

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

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

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

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

1. [S3 콘솔에](https://console.aws.amazon.com/s3/) 로그인하여 새로 생성된 버킷의 새 객체를 확인합니다.

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

### Success
<a name="get-started-success"></a>

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

### 정리
<a name="cleanup"></a>

이 자습서를 진행하는 동안 생성한 리소스를 정리하려면 다음을 수행합니다.
+ 아직 삭제하지 않았다면 [S3 콘솔에서](https://console.aws.amazon.com/s3/) 애플리케이션을 실행할 때 생성된 모든 객체와 버킷을 삭제하세요.
+ 프로젝트 폴더를 삭제합니다(`getstarted`).

## 다음 단계
<a name="get-started-next"></a>

이제 기본 사항을 갖추었으므로, 다음 내용을 배울 수 있습니다.
+  [작업 Amazon S3](examples-s3.md) 
+  , [DynamoDB](examples-dynamodb.md) [Amazon EC2](examples-ec2.md)및 [다양한 데이터베이스 서비스와](examples-databases.md) 같은 [다른 서비스 작업 Amazon Web Services](work-with-services.md) 
+  [SDK 사용](using.md) 
+  [AWS SDK for Java에서의 보안](security.md) **