

 AWS SDK for Java 1.x는 2025년 12월 31일에 end-of-support되었습니다. 새로운 기능, 가용성 개선 및 보안 업데이트를 계속 받으려면 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html)로 마이그레이션하는 것이 좋습니다.

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

# Amazon S3를 사용하는 예제AWS SDK for Java
<a name="examples-s3"></a>

이 섹션에서는 [AWS SDK for Java](https://aws.amazon.com/sdk-for-java/)를 사용한 [Amazon S3](https://aws.amazon.com/s3/) 프로그래밍의 예제를 제공합니다.

**참고**  
예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. [전체 예제 코드는 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/java)에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

**Topics**
+ [Amazon S3 버킷 생성, 나열, 삭제](examples-s3-buckets.md)
+ [Amazon S3 객체에 대한 작업 수행](examples-s3-objects.md)
+ [버킷 및 객체에 대한 Amazon S3 액세스 권한 관리](examples-s3-access-permissions.md)
+ [버킷 정책을 사용한 Amazon S3 버킷 액세스 관리](examples-s3-bucket-policies.md)
+ [Amazon S3 운영을 위한 TransferManager 사용](examples-s3-transfermanager.md)
+ [Amazon S3 버킷을 웹 사이트로 구성](examples-s3-website-configuration.md)
+ [Amazon S3 클라이언트 측 암호화 사용](examples-crypto.md)

# Amazon S3 버킷 생성, 나열, 삭제
<a name="examples-s3-buckets"></a>

Amazon S3의 모든 객체(파일)은 객체의 모음(컨테이너)을 나타내는 *버킷*에 상주해야 합니다. 각 버킷은 *키*(이름)로 인식되며, 각 키는 고유해야 합니다. 버킷 및 구성에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서의 [Amazon S3 버킷 사용을](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html) 참조하세요.

**참고**  
모범 사례  
Amazon S3 버킷에서 [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) 수명 주기 규칙을 활성화하는 것이 좋습니다.  
이 규칙은 시작된 후 지정된 일수 내에 완료되지 않은 멀티파트 업로드를 중단하도록 Amazon S3에 지시합니다. 설정된 시간 제한을 초과하면 Amazon S3가 업로드를 중단한 후 완료되지 않은 업로드 데이터를 삭제합니다.  
자세한 내용은 Amazon S3 사용 설명서의 [버전 관리가 포함된 버킷의 수명 주기 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-bucket-with-versioning.html)을 참조하세요.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

## 버킷 만들기
<a name="create-bucket"></a>

AmazonS3 클라이언트의 `createBucket` 메서드를 사용하세요. 새 [버킷](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Bucket.html)이 반환됩니다. 해당 버킷이 이미 존재하는 경우에는 `createBucket` 메서드에서 예외가 발생합니다.

**참고**  
동일한 이름의 버킷을 생성하기 전에 버킷이 이미 존재하는지 여부를 확인하려면 `doesBucketExist` 메서드를 호출합니다. 이 메서드는 버킷이 존재하는 경우 `true`를 반환하고, 그렇지 않으면 `false`를 반환합니다.

 **가져옵니다**.

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.Bucket;

import java.util.List;
```

 ** 코드** 

```
if (s3.doesBucketExistV2(bucket_name)) {
    System.out.format("Bucket %s already exists.\n", bucket_name);
    b = getBucket(bucket_name);
} else {
    try {
        b = s3.createBucket(bucket_name);
    } catch (AmazonS3Exception e) {
        System.err.println(e.getErrorMessage());
    }
}
return b;
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/CreateBucket.java)를 참조하세요.

## 버킷 목록 생성
<a name="list-buckets"></a>

AmazonS3 클라이언트의 `listBucket` 메서드를 사용하세요. 성공하면 [버킷](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Bucket.html)이 반환됩니다.

 **가져옵니다**.

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;

import java.util.List;
```

 ** 코드** 

```
List<Bucket> buckets = s3.listBuckets();
System.out.println("Your {S3} buckets are:");
for (Bucket b : buckets) {
    System.out.println("* " + b.getName());
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/ListBuckets.java)를 참조하세요.

## 버킷 삭제
<a name="delete-bucket"></a>

Amazon S3 버킷을 삭제하려면 먼저 버킷이 비어 있는지 확인해야 합니다. 비어 있지 않으면 오류가 발생합니다. [버전 지정된 버킷](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html)이 있으면 버킷과 연결된 버전 지정된 객체도 모두 삭제해야 합니다.

**참고**  
[전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java)에는 Amazon S3 버킷 및 관련 콘텐츠를 삭제하기 위한 전체 솔루션을 제공하는 다음의 각 단계가 순서대로 포함됩니다.

**Topics**
+ [삭제하기 전에 버전이 지정되지 않은 버킷에서 객체 제거](#remove-objects-from-an-unversioned-bucket-before-deleting-it)
+ [삭제하기 전에 버전 지정된 버킷에서 객체 제거](#remove-objects-from-a-versioned-bucket-before-deleting-it)
+ [빈 버킷 삭제](#delete-an-empty-bucket)

### 삭제하기 전에 버전이 지정되지 않은 버킷에서 객체 제거
<a name="remove-objects-from-an-unversioned-bucket-before-deleting-it"></a>

AmazonS3 클라이언트의 `listObjects` 메서드를 사용하여 객체 목록을 가져오고 `deleteObject`를 사용하여 각 객체를 삭제합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 ** 코드** 

```
System.out.println(" - removing objects from bucket");
ObjectListing object_listing = s3.listObjects(bucket_name);
while (true) {
    for (Iterator<?> iterator =
         object_listing.getObjectSummaries().iterator();
         iterator.hasNext(); ) {
        S3ObjectSummary summary = (S3ObjectSummary) iterator.next();
        s3.deleteObject(bucket_name, summary.getKey());
    }

    // more object_listing to retrieve?
    if (object_listing.isTruncated()) {
        object_listing = s3.listNextBatchOfObjects(object_listing);
    } else {
        break;
    }
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java)를 참조하세요.

### 삭제하기 전에 버전 지정된 버킷에서 객체 제거
<a name="remove-objects-from-a-versioned-bucket-before-deleting-it"></a>

[버전 지정된 버킷](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html)을 사용 중인 경우 버킷을 삭제하려면 먼저 버킷에 있는 저장된 객체 버전도 모두 제거해야 합니다.

버킷에 있는 객체를 제거할 때와 비슷한 패턴을 사용하여, AmazonS3 클라이언트의 `listVersions` 메서드를 사용하여 버전 지정된 객체를 나열한 후 `deleteVersion`을 사용하여 각 객체를 삭제함으로써 버전 지정된 객체를 제거합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 ** 코드** 

```
System.out.println(" - removing versions from bucket");
VersionListing version_listing = s3.listVersions(
        new ListVersionsRequest().withBucketName(bucket_name));
while (true) {
    for (Iterator<?> iterator =
         version_listing.getVersionSummaries().iterator();
         iterator.hasNext(); ) {
        S3VersionSummary vs = (S3VersionSummary) iterator.next();
        s3.deleteVersion(
                bucket_name, vs.getKey(), vs.getVersionId());
    }

    if (version_listing.isTruncated()) {
        version_listing = s3.listNextBatchOfVersions(
                version_listing);
    } else {
        break;
    }
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java)를 참조하세요.

### 빈 버킷 삭제
<a name="delete-an-empty-bucket"></a>

버킷에서 객체(버전 지정된 모든 객체 포함)를 제거하고 나면 클라이언트의 AmazonS3의 `deleteBucket` 메서드를 사용하여 버킷 자체를 삭제할 수 있습니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.util.Iterator;
```

 ** 코드** 

```
System.out.println(" OK, bucket ready to delete!");
s3.deleteBucket(bucket_name);
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucket.java)를 참조하세요.

# Amazon S3 객체에 대한 작업 수행
<a name="examples-s3-objects"></a>

Amazon S3 객체는 데이터 모음 또는 *파일*을 나타냅니다. 각 객체는 [버킷](examples-s3-buckets.md) 안에 상주해야 합니다.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

**Topics**
+ [객체 업로드](#upload-object)
+ [객체 목록 생성](#list-objects)
+ [객체 다운로드](#download-object)
+ [객체 복사, 이동 또는 이름 바꾸기](#copy-object)
+ [객체 삭제](#delete-object)
+ [여러 객체를 한 번에 삭제](#delete-objects)

## 객체 업로드
<a name="upload-object"></a>

AmazonS3 클라이언트의 `putObject` 메서드를 사용하여 버킷 이름, 키 이름, 업로드할 파일을 지정합니다. *버킷 이름이 존재해야 합니다. 그렇지 않으면 오류가 발생합니다*.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 ** 코드** 

```
System.out.format("Uploading %s to S3 bucket %s...\n", file_path, bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.putObject(bucket_name, key_name, new File(file_path));
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/PutObject.java)를 참조하세요.

## 객체 목록 생성
<a name="list-objects"></a>

버킷 내에서 객체 목록을 가져오려면 AmazonS3 클라이언트의 `listObjects` 메서드를 사용하여 버킷 이름을 지정합니다.

`listObjects` 메서드는 버킷의 객체에 대한 정보를 제공하는 [ObjectListing](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/ObjectListing.html) 객체를 반환합니다. 객체 이름(키)을 나열하려면 `getObjectSummaries` 메서드를 사용하여 [S3ObjectSummary](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3ObjectSummary.html) 객체 목록을 가져옵니다. 이때 각 객체는 버킷에 있는 단일 객체를 나타냅니다. 그런 다음 `getKey` 메서드를 호출하여 객체의 이름을 가져옵니다.

 **가져옵니다**.

```
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.S3ObjectSummary;
```

 ** 코드** 

```
System.out.format("Objects in S3 bucket %s:\n", bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
ListObjectsV2Result result = s3.listObjectsV2(bucket_name);
List<S3ObjectSummary> objects = result.getObjectSummaries();
for (S3ObjectSummary os : objects) {
    System.out.println("* " + os.getKey());
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/ListObjects.java)를 참조하세요.

## 객체 다운로드
<a name="download-object"></a>

AmazonS3 클라이언트의 `getObject` 메서드를 사용하여 다운로드할 버킷의 이름 및 객체의 이름을 전달합니다. 성공하면 이 메서드는 [S3Object](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3Object.html)를 반환합니다. *지정한 버킷 및 객체 키가 존재해야 합니다. 그렇지 않으면 오류가 발생합니다*.

`getObjectContent`에 대해 `S3Object`를 호출하여 객체의 내용을 가져올 수 있습니다. 그러면 표준 자바 `InputStream` 객체처럼 동작하는 [S3ObjectInputStream](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/S3ObjectInputStream.html)이 반환됩니다.

다음 예제는 S3에서 객체를 다운로드하고 이 객체의 내용을 (객체 키와 동일한 이름을 사용하여) 파일에 저장합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;

import java.io.File;
```

 ** 코드** 

```
System.out.format("Downloading %s from S3 bucket %s...\n", key_name, bucket_name);
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    S3Object o = s3.getObject(bucket_name, key_name);
    S3ObjectInputStream s3is = o.getObjectContent();
    FileOutputStream fos = new FileOutputStream(new File(key_name));
    byte[] read_buf = new byte[1024];
    int read_len = 0;
    while ((read_len = s3is.read(read_buf)) > 0) {
        fos.write(read_buf, 0, read_len);
    }
    s3is.close();
    fos.close();
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
} catch (FileNotFoundException e) {
    System.err.println(e.getMessage());
    System.exit(1);
} catch (IOException e) {
    System.err.println(e.getMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetObject.java)를 참조하세요.

## 객체 복사, 이동 또는 이름 바꾸기
<a name="copy-object"></a>

AmazonS3 클라이언트의 `copyObject` 메서드를 사용하여 한 버킷에서 다른 버킷으로 객체를 복사할 수 있습니다. 복사할 버킷의 이름, 복사할 객체 그리고 대상 버킷 이름을 가져옵니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
```

 ** 코드** 

```
try {
    s3.copyObject(from_bucket, object_key, to_bucket, object_key);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
System.out.println("Done!");
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/CopyObject.java)를 참조하세요.

**참고**  
`copyObject`와 [deleteObject](#delete-object)를 함께 사용하면 먼저 객체를 새 이름으로 복사한 다음(동일한 버킷을 소스와 대상으로 모두 사용 가능) 이전 위치에서 해당 객체를 삭제하는 방식으로 객체를 **이동**하거나 **이름을 바꿀 수** 있습니다.

## 객체 삭제
<a name="delete-object"></a>

AmazonS3 클라이언트의 `deleteObject` 메서드를 사용하여 삭제할 버킷 및 객체의 이름을 전달합니다. *지정한 버킷 및 객체 키가 존재해야 합니다. 그렇지 않으면 오류가 발생합니다*.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.deleteObject(bucket_name, object_key);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteObject.java)를 참조하세요.

## 여러 객체를 한 번에 삭제
<a name="delete-objects"></a>

Amazon S3 클라이언트의 `deleteObjects` 메서드를 사용하면 link:sdk-for-java/v1/reference/com/amazonaws/services/s3/model/DeleteObjectsRequest.html `` 메서드에 해당 이름을 전달하여 동일한 버킷에서 여러 객체를 삭제할 수 있습니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    DeleteObjectsRequest dor = new DeleteObjectsRequest(bucket_name)
            .withKeys(object_keys);
    s3.deleteObjects(dor);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteObjects.java)를 참조하세요.

# 버킷 및 객체에 대한 Amazon S3 액세스 권한 관리
<a name="examples-s3-access-permissions"></a>

Amazon S3 리소스를 세부적으로 제어하려는 경우 Amazon S3 버킷 및 객체에 대한 ACL(액세스 제어 목록)을 사용할 수 있습니다.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

## 버킷에 대한 액세스 제어 목록 가져오기
<a name="get-the-access-control-list-for-a-bucket"></a>

버킷에 대한 현재 ACL(액세스 제어 목록)을 가져오려면 AmazonS3의 `getBucketAcl` 메서드를 호출하고 쿼리할 *버킷 이름*을 메서드에 전달합니다. 이 메서드는 [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) 객체를 반환합니다. 각 액세스 권한 부여(grant) 목록을 가져오려면 `getGrantsAsList` 메서드를 호출합니다. 그러면 [Grant](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grant.html) 객체의 표준 Java 목록이 반환됩니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Grant;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    AccessControlList acl = s3.getBucketAcl(bucket_name);
    List<Grant> grants = acl.getGrantsAsList();
    for (Grant grant : grants) {
        System.out.format("  %s: %s\n", grant.getGrantee().getIdentifier(),
                grant.getPermission().toString());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetAcl.java)를 참조하세요.

## 버킷에 대한 액세스 제어 목록 설정
<a name="set-the-access-control-list-for-a-bucket"></a>

버킷에 대한 ACL(액세스 제어 목록)에 권한을 추가하거나 권한을 수정하려면 AmazonS3의 `setBucketAcl` 메서드를 호출합니다. 이 메서드는 설정할 액세스 수준과 피부여자 목록을 포함하는 [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) 객체를 사용합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.EmailAddressGrantee;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    // get the current ACL
    AccessControlList acl = s3.getBucketAcl(bucket_name);
    // set access for the grantee
    EmailAddressGrantee grantee = new EmailAddressGrantee(email);
    Permission permission = Permission.valueOf(access);
    acl.grantPermission(grantee, permission);
    s3.setBucketAcl(bucket_name, acl);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

**참고**  
[Grantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grantee.html) 클래스를 사용하여 직접 피부여자의 고유 식별자를 제공하거나, 여기서처럼 [EmailAddressGrantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/EmailAddressGrantee.html) 클래스를 사용하여 이메일을 통해 피부여자를 설정할 수 있습니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetAcl.java)를 참조하세요.

## 객체에 대한 액세스 제어 목록 가져오기
<a name="get-the-access-control-list-for-an-object"></a>

객체에 대한 현재 ACL(액세스 제어 목록)을 가져오려면 AmazonS3의 `getObjectAcl` 메서드를 호출하고 쿼리할 *버킷 이름*과 *객체 이름*을 이 메서드에 전달합니다. `getBucketAcl`과 마찬가지로 이 메서드는 각 [Grant](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grant.html) 검사하는 데 사용할 수 있는 [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) 객체를 반환합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Grant;
```

 ** 코드** 

```
try {
    AccessControlList acl = s3.getObjectAcl(bucket_name, object_key);
    List<Grant> grants = acl.getGrantsAsList();
    for (Grant grant : grants) {
        System.out.format("  %s: %s\n", grant.getGrantee().getIdentifier(),
                grant.getPermission().toString());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetAcl.java)를 참조하세요.

## 객체에 대한 액세스 제어 목록 설정
<a name="set-the-access-control-list-for-an-object"></a>

객체에 대한 ACL(액세스 제어 목록)에 권한을 추가하거나 권한을 수정하려면 AmazonS3의 `setObjectAcl` 메서드를 호출합니다. 이 메서드는 설정할 액세스 수준과 피부여자 목록을 포함하는 [AccessControlList](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/AccessControlList.html) 객체를 사용합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.EmailAddressGrantee;
```

 ** 코드** 

```
    try {
        // get the current ACL
        AccessControlList acl = s3.getObjectAcl(bucket_name, object_key);
        // set access for the grantee
        EmailAddressGrantee grantee = new EmailAddressGrantee(email);
        Permission permission = Permission.valueOf(access);
        acl.grantPermission(grantee, permission);
        s3.setObjectAcl(bucket_name, object_key, acl);
    } catch (AmazonServiceException e) {
        System.err.println(e.getErrorMessage());
        System.exit(1);
    }
}
```

**참고**  
[Grantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/Grantee.html) 클래스를 사용하여 직접 피부여자의 고유 식별자를 제공하거나, 여기서처럼 [EmailAddressGrantee](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/EmailAddressGrantee.html) 클래스를 사용하여 이메일을 통해 피부여자를 설정할 수 있습니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetAcl.java)를 참조하세요.

## 추가 정보
<a name="more-information"></a>
+  Amazon S3 API 참조의 [GET 버킷 ACL(액세스 제어 목록)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETacl.html)
+  Amazon S3 API 참조의 [PUT 버킷 ACL(액세스 제어 목록)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html)
+  Amazon S3 API 참조의 [GET 객체 ACL(액세스 제어 목록)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html)
+  Amazon S3 API 레퍼런스의 [PUT 객체 ACL(액세스 제어 목록)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html)

# 버킷 정책을 사용한 Amazon S3 버킷 액세스 관리
<a name="examples-s3-bucket-policies"></a>

*버킷 정책*을 설정하거나 가져오거나 삭제하여 Amazon S3 버킷에 대한 액세스를 관리할 수 있습니다.

## 버킷 정책 설정
<a name="set-s3-bucket-policy"></a>

다음과 같은 방법으로 특정 S3 버킷에 대한 버킷 정책을 설정할 수 있습니다.
+ AmazonS3 클라이언트의 `setBucketPolicy`를 호출하고 이 메서드에 [SetBucketPolicyRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/SetBucketPolicyRequest.html) 지정 
+ 버킷 이름과 정책 텍스트(JSON 형식)를 사용하는 `setBucketPolicy` 오버로드를 사용하여 정책을 직접 설정

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Principal;
```

 ** 코드** 

```
    s3.setBucketPolicy(bucket_name, policy_text);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

### Policy 클래스를 사용하여 정책 생성 또는 검사
<a name="use-s3-bucket-policy-class"></a>

`setBucketPolicy`에 버킷 정책을 제공하려는 경우 다음을 수행합니다.
+ 정책을 JSON 형식 텍스트 문자열로 직접 지정
+ [Policy](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/policy/Policy.html) 클래스를 사용하여 정책 빌드

`Policy` 클래스를 사용하면 텍스트 문자열에 대한 올바른 형식 지정에 대해 걱정할 필요가 없습니다. `Policy` 클래스에서 JSON 정책 텍스트를 가져오려면 `toJson` 메서드를 사용합니다.

 **가져옵니다**.

```
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.actions.S3Actions;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 ** 코드** 

```
        new Statement(Statement.Effect.Allow)
                .withPrincipals(Principal.AllUsers)
                .withActions(S3Actions.GetObject)
                .withResources(new Resource(
                        "{region-arn}s3:::" + bucket_name + "/*")));
return bucket_policy.toJson();
```

`Policy` 클래스는 전달된 JSON 문자열을 사용하여 정책을 빌드할 수 있는 `fromJson` 메서드도 제공합니다. 이 메서드는 해당 텍스트를 유효한 정책 구조로 변환할 수 있는지 검사하며, 정책 텍스트가 유효하지 않은 경우 실패하고 `IllegalArgumentException`가 발생합니다.

```
Policy bucket_policy = null;
try {
    bucket_policy = Policy.fromJson(file_text.toString());
} catch (IllegalArgumentException e) {
    System.out.format("Invalid policy text in file: \"%s\"",
            policy_file);
    System.out.println(e.getMessage());
}
```

이 기술을 사용하여 파일이나 기타 수단에서 읽어온 정책을 사전 검사할 수 있습니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetBucketPolicy.java)를 참조하세요.

## 버킷 정책 가져오기
<a name="get-s3-bucket-policy"></a>

Amazon S3 버킷에 대한 정책을 가져오려면 AmazonS3 클라이언트의 `getBucketPolicy` 메서드를 호출하고 정책을 가져올 버킷의 이름을 이 메서드에 전달합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 ** 코드** 

```
  try {
      BucketPolicy bucket_policy = s3.getBucketPolicy(bucket_name);
      policy_text = bucket_policy.getPolicyText();
  } catch (AmazonServiceException e) {
      System.err.println(e.getErrorMessage());
      System.exit(1);
  }
```

이름이 지정된 버킷이 없거나, 해당 버킷에 대한 액세스 권한이 없거나, 버킷 정책이 없는 경우 `AmazonServiceException`이 발생합니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetBucketPolicy.java)를 참조하세요.

## 버킷 정책 삭제
<a name="delete-s3-bucket-policy"></a>

버킷 정책을 삭제하려면 AmazonS3 클라이언트의 `deleteBucketPolicy`를 호출하고 이 메서드에 버킷 이름을 제공합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
```

 ** 코드** 

```
  try {
      s3.deleteBucketPolicy(bucket_name);
  } catch (AmazonServiceException e) {
      System.err.println(e.getErrorMessage());
      System.exit(1);
  }
```

버킷에 정책이 아직 없더라도 이 메서드는 성공합니다. 존재하지 않는 버킷 이름을 지정하거나 해당 버킷에 대한 액세스 권한이 없는 경우 `AmazonServiceException`이 발생합니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteBucketPolicy.java)를 참조하세요.

## 추가 정보
<a name="more-info"></a>
+  Amazon Simple Storage Service 사용 설명서의 [액세스 정책 언어 개요](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html)
+  Amazon Simple Storage Service 사용 설명서의 [버킷 정책 예제](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html)

# Amazon S3 운영을 위한 TransferManager 사용
<a name="examples-s3-transfermanager"></a>

AWS SDK for Java TransferManager 클래스를 사용하여 로컬 환경에서 Amazon S3로 파일을 안정적으로 전송하고 한 S3 위치에서 다른 위치로 객체를 복사할 수 있습니다. `TransferManager`는 전송 진행 상황을 가져오고 업로드 및 다운로드를 일시 중지 또는 재개할 수 있습니다.

**참고**  
모범 사례  
Amazon S3 버킷에서 [AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) 수명 주기 규칙을 활성화하는 것이 좋습니다.  
이 규칙은 시작된 후 지정된 일수 내에 완료되지 않은 멀티파트 업로드를 중단하도록 Amazon S3에 지시합니다. 설정된 시간 제한을 초과하면 Amazon S3가 업로드를 중단한 후 완료되지 않은 업로드 데이터를 삭제합니다.  
자세한 내용은 Amazon S3 사용 설명서의 [버전 관리가 포함된 버킷의 수명 주기 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-bucket-with-versioning.html)을 참조하세요.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

## 파일 및 디렉터리 업로드
<a name="transfermanager-uploading"></a>

TransferManager는 [이전에 생성한](examples-s3-buckets.md#create-bucket) 모든 Amazon S3 버킷에 파일, 파일 목록 및 디렉터리를 업로드할 수 있습니다.

**Topics**
+ [단일 파일 업로드](#transfermanager-upload-file)
+ [파일 목록 업로드](#transfermanager-upload-file-list)
+ [디렉터리 업로드](#transfermanager-upload-directory)

### 단일 파일 업로드
<a name="transfermanager-upload-file"></a>

TransferManager의 `upload` 메서드를 호출하여 Amazon S3 버킷 이름, 키(객체) 이름, 업로드할 파일을 나타내는 표준 Java [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체를 입력합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 ** 코드** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Upload xfer = xfer_mgr.upload(bucket_name, key_name, f);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    //  or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

`upload` 메서드는 (값을) *즉시* 반환하며, 전송 상태를 확인하거나 완료될 때까지 대기하는 데 사용할 `Upload` 객체를 제공합니다.

TransferManager의 `shutdownNow` 메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 `waitForCompletion`를 사용하는 방법에 대한 자세한 내용은 [전송이 완료될 때까지 대기](#transfermanager-wait-for-completion)를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 [전송 상태 및 진행 상황 가져오기](#transfermanager-get-status-and-progress)를 참조하십시오.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java)를 참조하세요.

### 파일 목록 업로드
<a name="transfermanager-upload-file-list"></a>

여러 파일을 한 번에 업로드하려면 다음을 지정하여 TransferManager `uploadFileList` 메서드를 호출합니다.
+ Amazon S3 버킷 이름
+ *키 접두사* - 생성된 객체의 이름(객체를 넣을 버킷 내 경로) 앞에 붙습니다.
+ [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체 - 파일 경로를 생성할 상대 디렉터리를 나타냅니다.
+ [List](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/List.html) 객체 - 업로드할 [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체 세트를 포함합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 ** 코드** 

```
ArrayList<File> files = new ArrayList<File>();
for (String path : file_paths) {
    files.add(new File(path));
}

TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    MultipleFileUpload xfer = xfer_mgr.uploadFileList(bucket_name,
            key_prefix, new File("."), files);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

TransferManager의 `shutdownNow` 메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 `waitForCompletion`를 사용하는 방법에 대한 자세한 내용은 [전송이 완료될 때까지](#transfermanager-wait-for-completion) 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 [전송 상태 및 진행 상황 가져오기](#transfermanager-get-status-and-progress)를 참조하십시오.

`uploadFileList`에서 반환한 [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) 객체를 사용하여 전송 상태 또는 진행 상황을 쿼리할 수 있습니다. 자세한 내용은 [현재 전송 진행 상황 폴링](#transfermanager-get-progress-polling) 및 [ProgressListener를 사용하여 전송 진행 상황 가져오기](#transfermanager-progress-listener)를 참조하십시오.

또한 `MultipleFileUpload`'s `getSubTransfers` 메서드를 사용하여 전송될 각 파일의 `Upload` 객체를 가져올 수도 있습니다. 자세한 내용은 [하위 전송 진행 상황 가져오기](#transfermanager-get-subtransfer-progress)를 참조하십시오.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java)를 참조하세요.

### 디렉터리 업로드
<a name="transfermanager-upload-directory"></a>

TransferManager의 `uploadDirectory` 메서드와 하위 디렉터리의 파일을 재귀적으로 복사하는 옵션을 사용하여 전체 파일 디렉터리를 업로드할 수 있습니다. Amazon S3 버킷 이름, S3 키 접두사, [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체(복사할 로컬 디렉터리를 나타냄) 및 `boolean` 값(하위 디렉터리를 재귀적으로 복사할지 여부를 나타내는 값으로, *true* 또는 *false*)을 제공합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.MultipleFileUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
```

 ** 코드** 

```
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucket_name,
            key_prefix, new File(dir_path), recursive);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

TransferManager의 `shutdownNow` 메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 `waitForCompletion`를 사용하는 방법에 대한 자세한 내용은 [전송이 완료될 때까지](#transfermanager-wait-for-completion) 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 [전송 상태 및 진행 상황 가져오기](#transfermanager-get-status-and-progress)를 참조하십시오.

`uploadFileList`에서 반환한 [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) 객체를 사용하여 전송 상태 또는 진행 상황을 쿼리할 수 있습니다. 자세한 내용은 [현재 전송 진행 상황 폴링](#transfermanager-get-progress-polling) 및 [ProgressListener를 사용하여 전송 진행 상황 가져오기](#transfermanager-progress-listener)를 참조하십시오.

또한 `MultipleFileUpload`'s `getSubTransfers` 메서드를 사용하여 전송될 각 파일의 `Upload` 객체를 가져올 수도 있습니다. 자세한 내용은 [하위 전송 진행 상황 가져오기](#transfermanager-get-subtransfer-progress)를 참조하십시오.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrUpload.java)를 참조하세요.

## 파일 또는 디렉터리 다운로드
<a name="transfermanager-downloading"></a>

TransferManager 클래스를 사용하여 Amazon S3에서 단일 파일(Amazon S3 객체) 또는 디렉터리(Amazon S3 버킷 이름 뒤에 객체 접두사 지정)를 다운로드할 수 있습니다.

**Topics**
+ [단일 파일 다운로드](#transfermanager-download-file)
+ [디렉터리 다운로드](#tranfermanager-download-directory)

### 단일 파일 다운로드
<a name="transfermanager-download-file"></a>

TransferManager의 `download` 메서드를 사용하여 다운로드할 객체를 포함하는 Amazon S3 버킷 이름, 키(객체) 이름 및 로컬 시스템에 생성할 파일을 나타내는 [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체를 지정합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.MultipleFileDownload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;

import java.io.File;
```

 ** 코드** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Download xfer = xfer_mgr.download(bucket_name, key_name, f);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

TransferManager의 `shutdownNow` 메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 `waitForCompletion`를 사용하는 방법에 대한 자세한 내용은 [전송이 완료될 때까지](#transfermanager-wait-for-completion) 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 [전송 상태 및 진행 상황 가져오기](#transfermanager-get-status-and-progress)를 참조하십시오.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrDownload.java)를 참조하세요.

### 디렉터리 다운로드
<a name="tranfermanager-download-directory"></a>

Amazon S3에서 공통 키 접두사(파일 시스템의 디렉터리와 유사)를 공유하는 파일 세트를 다운로드하려면 TransferManager `downloadDirectory` 메서드를 사용합니다. 이 메서드는 다운로드할 객체를 포함하는 Amazon S3 버킷 이름, 모든 객체에서 공유하는 객체 접두사, 그리고 파일을 로컬 시스템으로 다운로드할 디렉터리를 나타내는 [File](https://docs.oracle.com/javase/8/docs/api/index.html?java/io/File.html) 객체를 사용합니다. 이름이 지정된 디렉터리가 아직 없으면 생성됩니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.MultipleFileDownload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;

import java.io.File;
```

 ** 코드** 

```
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();

try {
    MultipleFileDownload xfer = xfer_mgr.downloadDirectory(
            bucket_name, key_prefix, new File(dir_path));
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

TransferManager의 `shutdownNow` 메서드를 호출하기 전에 전송을 성공적으로 완료하는 데 `waitForCompletion`를 사용하는 방법에 대한 자세한 내용은 [전송이 완료될 때까지](#transfermanager-wait-for-completion) 대기를 참조하세요. 전송이 완료될 때까지 대기하는 동안 상태 및 진행 상황에 대한 업데이트를 폴링하거나 수신 대기할 수 있습니다. 자세한 내용은 [전송 상태 및 진행 상황 가져오기](#transfermanager-get-status-and-progress)를 참조하십시오.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrDownload.java)를 참조하세요.

## 객체 복사
<a name="transfermanager-copy-object"></a>

한 S3 버킷에서 다른 버킷으로 객체를 복사하려면 TransferManager `copy` 메서드를 사용합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.transfer.Copy;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
```

 ** 코드** 

```
System.out.println("Copying s3 object: " + from_key);
System.out.println("      from bucket: " + from_bucket);
System.out.println("     to s3 object: " + to_key);
System.out.println("        in bucket: " + to_bucket);

TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Copy xfer = xfer_mgr.copy(from_bucket, from_key, to_bucket, to_key);
    // loop with Transfer.isDone()
    XferMgrProgress.showTransferProgress(xfer);
    // or block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(xfer);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrCopy.java)를 참조하세요.

## 전송 완료 대기
<a name="transfermanager-wait-for-completion"></a>

전송이 완료될 때까지 애플리케이션(또는 스레드)을 차단할 수 있는 경우 [Transfer](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) 인터페이스의 `waitForCompletion` 메서드를 사용하여 전송이 완료되거나 예외가 발생할 때까지 차단할 수 있습니다.

```
try {
    xfer.waitForCompletion();
} catch (AmazonServiceException e) {
    System.err.println("Amazon service error: " + e.getMessage());
    System.exit(1);
} catch (AmazonClientException e) {
    System.err.println("Amazon client error: " + e.getMessage());
    System.exit(1);
} catch (InterruptedException e) {
    System.err.println("Transfer interrupted: " + e.getMessage());
    System.exit(1);
}
```

`waitForCompletion`를 호출하기 *전에* 이벤트를 폴링하거나, 별도의 스레드에서 폴링 메커니즘을 구현하거나, [ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html)를 사용하여 비동기적으로 진행 상황 업데이트를 수신하면 전송 진행 상황을 확인할 수 있습니다.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java)를 참조하세요.

## 전송 상태 및 진행 상황 가져오기
<a name="transfermanager-get-status-and-progress"></a>

TransferManager `upload*`, `download*` 및 `copy` 메서드에 의해 반환되는 각각의 클래스는 단일 파일 작업인지 다중 파일 작업인지에 따라 다음 클래스 중 하나의 인스턴스를 반환합니다.


**​**  

| Class | 반환 메서드 | 
| --- | --- | 
|   [Copy](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Copy.html)   |   `copy`   | 
|   [를 다운로드합니다](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Download.html).  |   `download`   | 
|   [MultipleFileDownload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileDownload.html)   |   `downloadDirectory`   | 
|   [업로드](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Upload.html)   |   `upload`   | 
|   [MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html)   |   `uploadFileList`, `uploadDirectory`   | 

이들 클래스는 모두 [Transfer](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) 인터페이스를 구현합니다. `Transfer`는 전송 진행 상황을 가져오거나, 전송을 일시 중지 또는 재개하거나, 전송의 현재 또는 최종 상태를 가져올 수 있는 유용한 메서드를 제공합니다.

**Topics**
+ [현재 전송 진행 상황 폴링](#transfermanager-get-progress-polling)
+ [ProgressListener를 사용하여 전송 진행 상황 가져오기](#transfermanager-progress-listener)
+ [하위 전송 진행 상황 가져오기](#transfermanager-get-subtransfer-progress)

### 현재 전송 진행 상황 폴링
<a name="transfermanager-get-progress-polling"></a>

이 루프는 전송 진행 상황을 출력하며, 실행 중에 현재 진행 상황을 검사하고, 완료되었을 때 최종 상태를 출력합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 ** 코드** 

```
// print the transfer's human-readable description
System.out.println(xfer.getDescription());
// print an empty progress bar...
printProgressBar(0.0);
// update the progress bar while the xfer is ongoing.
do {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        return;
    }
    // Note: so_far and total aren't used, they're just for
    // documentation purposes.
    TransferProgress progress = xfer.getProgress();
    long so_far = progress.getBytesTransferred();
    long total = progress.getTotalBytesToTransfer();
    double pct = progress.getPercentTransferred();
    eraseProgressBar();
    printProgressBar(pct);
} while (xfer.isDone() == false);
// print the final state of the transfer.
TransferState xfer_state = xfer.getState();
System.out.println(": " + xfer_state);
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java)를 참조하세요.

### ProgressListener를 사용하여 전송 진행 상황 가져오기
<a name="transfermanager-progress-listener"></a>

[전송](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Transfer.html) 인터페이스의 `addProgressListener` 메서드를 사용하여 [ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html)를 모든 전송에 연결할 수 있습니다.

[ProgressListener](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressListener.html)에는 `progressChanged`라는 메서드 하나만 필요하며, 이 메서드는 [ProgressEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/event/ProgressEvent.html) 객체를 사용합니다. 이 객체를 사용하면 `getBytes` 메서드를 호출하여 총 작업 바이트 수와 `getBytesTransferred`를 호출하여 지금까지 전송된 바이트 수를 가져올 수 있습니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 ** 코드** 

```
File f = new File(file_path);
TransferManager xfer_mgr = TransferManagerBuilder.standard().build();
try {
    Upload u = xfer_mgr.upload(bucket_name, key_name, f);
    // print an empty progress bar...
    printProgressBar(0.0);
    u.addProgressListener(new ProgressListener() {
        public void progressChanged(ProgressEvent e) {
            double pct = e.getBytesTransferred() * 100.0 / e.getBytes();
            eraseProgressBar();
            printProgressBar(pct);
        }
    });
    // block with Transfer.waitForCompletion()
    XferMgrProgress.waitForCompletion(u);
    // print the final state of the transfer.
    TransferState xfer_state = u.getState();
    System.out.println(": " + xfer_state);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
xfer_mgr.shutdownNow();
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java)를 참조하세요.

### 하위 전송 진행 상황 가져오기
<a name="transfermanager-get-subtransfer-progress"></a>

[MultipleFileUpload](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/MultipleFileUpload.html) 클래스는 `getSubTransfers` 메서드를 호출하여 하위 전송에 대한 정보를 반환할 수 있습니다. 각 하위 전송의 개별 전송 상태 및 진행 상황을 제공하는 수정 불가능한 [업로드](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/Upload.html) [컬렉션](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Collection.html) 객체를 반환합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.services.s3.transfer.Transfer.TransferState;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
```

 ** 코드** 

```
Collection<? extends Upload> sub_xfers = new ArrayList<Upload>();
sub_xfers = multi_upload.getSubTransfers();

do {
    System.out.println("\nSubtransfer progress:\n");
    for (Upload u : sub_xfers) {
        System.out.println("  " + u.getDescription());
        if (u.isDone()) {
            TransferState xfer_state = u.getState();
            System.out.println("  " + xfer_state);
        } else {
            TransferProgress progress = u.getProgress();
            double pct = progress.getPercentTransferred();
            printProgressBar(pct);
            System.out.println();
        }
    }

    // wait a bit before the next update.
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        return;
    }
} while (multi_upload.isDone() == false);
// print the final state of the transfer.
TransferState xfer_state = multi_upload.getState();
System.out.println("\nMultipleFileUpload " + xfer_state);
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/XferMgrProgress.java)를 참조하세요.

## 추가 정보
<a name="transfermanager-see-also"></a>
+  Amazon Simple Storage Service 사용 설명서의 [객체 키](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html)

# Amazon S3 버킷을 웹 사이트로 구성
<a name="examples-s3-website-configuration"></a>

웹 사이트로 작동하도록 Amazon S3 버킷을 구성할 수 있습니다. 이렇게 하려면 웹 사이트 구성을 설정해야 합니다.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

## 버킷의 웹 사이트 구성 설정
<a name="set-a-bucket-s-website-configuration"></a>

Amazon S3버킷의 웹 사이트 구성을 설정하려면 구성을 설정할 버킷 이름과 버킷의 웹 사이트 구성이 포함된 [BucketWebsiteConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/BucketWebsiteConfiguration.html) 객체를 사용하여 AmazonS3의 `setWebsiteConfiguration` 메서드를 호출합니다.

인덱스 문서 설정은 *필수*이며, 그 밖의 다른 파라미터는 선택적 파라미터입니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketWebsiteConfiguration;
```

 ** 코드** 

```
    String bucket_name, String index_doc, String error_doc) {
BucketWebsiteConfiguration website_config = null;

if (index_doc == null) {
    website_config = new BucketWebsiteConfiguration();
} else if (error_doc == null) {
    website_config = new BucketWebsiteConfiguration(index_doc);
} else {
    website_config = new BucketWebsiteConfiguration(index_doc, error_doc);
}

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.setBucketWebsiteConfiguration(bucket_name, website_config);
} catch (AmazonServiceException e) {
    System.out.format(
            "Failed to set website configuration for bucket '%s'!\n",
            bucket_name);
    System.err.println(e.getErrorMessage());
    System.exit(1);
}
```

**참고**  
웹 사이트 구성을 설정해도 버킷의 액세스 권한을 수정되지 않습니다. 또한 파일이 웹에 표시되도록 하려면 버킷 내 파일에 대한 퍼블릭 읽기 액세스 권한을 허용하는 *버킷 정책*을 설정해야 합니다. 자세한 내용은 [버킷 정책을 사용하여 Amazon S3 버킷에 대한 액세스 관리](examples-s3-bucket-policies.md) 단원을 참조하세요.

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/SetWebsiteConfiguration.java)를 참조하세요.

## 버킷의 웹 사이트 구성 가져오기
<a name="get-a-bucket-s-website-configuration"></a>

Amazon S3 버킷의 웹 사이트 구성을 가져오려면 구성을 가져올 버킷의 이름과 함께 AmazonS3의 `getWebsiteConfiguration` 메서드를 호출합니다.

구성이 [BucketWebsiteConfiguration](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/BucketWebsiteConfiguration.html) 객체로 반환됩니다. 버킷에 대한 웹 사이트 구성이 없으면 `null`이 반환됩니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketWebsiteConfiguration;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    BucketWebsiteConfiguration config =
            s3.getBucketWebsiteConfiguration(bucket_name);
    if (config == null) {
        System.out.println("No website configuration found!");
    } else {
        System.out.format("Index document: %s\n",
                config.getIndexDocumentSuffix());
        System.out.format("Error document: %s\n",
                config.getErrorDocument());
    }
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.out.println("Failed to get website configuration!");
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/GetWebsiteConfiguration.java)를 참조하세요.

## 버킷의 웹 사이트 구성 삭제
<a name="delete-a-bucket-s-website-configuration"></a>

Amazon S3 버킷의 웹 사이트 구성을 삭제하려면 구성을 삭제할 버킷의 이름과 함께 AmazonS3의 `deleteWebsiteConfiguration` 메서드를 호출합니다.

 **가져옵니다**.

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
```

 ** 코드** 

```
final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
try {
    s3.deleteBucketWebsiteConfiguration(bucket_name);
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
    System.out.println("Failed to delete website configuration!");
    System.exit(1);
}
```

GitHub의 [전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/DeleteWebsiteConfiguration.java)를 참조하세요.

## 추가 정보
<a name="more-information"></a>
+  Amazon S3 API 참조의 [버킷 웹사이트 추가](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html)
+  Amazon S3 API 참조의 [버킷 웹사이트 가져오기](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETwebsite.html)
+  Amazon S3 API 참조의 [버킷 웹사이트 삭제](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html)

# Amazon S3 클라이언트 측 암호화 사용
<a name="examples-crypto"></a>

Amazon S3 암호화 클라이언트로 데이터를 암호화하는 것은 Amazon S3에 저장된 민감한 정보를 위해 보호 계층을 하나 더 추가하는 방법입니다. 이 단원의 예제에서는 애플리케이션용 Amazon S3 암호화 클라이언트를 만들고 구성하는 방법을 보여 줍니다.

암호화를 처음 사용하는 경우 AWS KMS 개발자 안내서의 [암호화 기본 사항](https://docs.aws.amazon.com/kms/latest/developerguide/crypto-intro.html)에서 암호화 용어 및 알고리즘에 대한 기본 개요를 참조하세요. 모든 AWS SDK의 암호화 지원에 대한 자세한 내용은 Amazon Web Services 일반 참조의 [Amazon S3 클라이언트 측 암호화에 대한 AWS SDK 지원](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html)을 참조하세요.

**참고**  
이 코드 예제에서는 사용자가 [AWS SDK for Java 사용](basics.md)의 내용을 이해하고 [개발을 위한 AWS 자격 증명 및 리전 설정](setup-credentials.md)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

AWS SDK for Java의 버전 1.11.836 또는 그 이전 버전을 사용하는 경우 애플리케이션을 최신 버전으로 마이그레이션하는 방법에 대한 자세한 내용은 [Amazon S3 암호화 클라이언트 마이그레이션을](s3-encryption-migration.md) 참조하세요. 마이그레이션할 수 없는 경우 GitHub에서 [이 전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/S3Encrypt.java)를 참조하세요.

또는 AWS SDK for Java의 버전 1.11.837 이상을 사용하는 경우 아래 나열된 예제 항목을 살펴보고 Amazon S3 클라이언트 측 암호화를 사용하세요.

**Topics**
+ [클라이언트 마스터 키를 사용한 Amazon S3 클라이언트 측 암호화](examples-crypto-masterkey.md)
+ [AWS KMS 관리형 키를 사용한 Amazon S3 클라이언트 측 암호화](examples-crypto-kms.md)

# 클라이언트 마스터 키를 사용한 Amazon S3 클라이언트 측 암호화
<a name="examples-crypto-masterkey"></a>

다음 예제에서는 [AmazonS3EncryptionClientV2Builder](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/AmazonS3EncryptionClientV2Builder.html) 클래스를 사용하여 클라이언트 측 암호화가 활성화된 Amazon S3 클라이언트를 만듭니다. 이렇게 설정하면 이 클라이언트로 Amazon S3에 업로드하는 모든 객체가 암호화됩니다. 또한 이 클라이언트를 사용하여 Amazon S3에서 가져오는 모든 객체는 자동으로 암호 해독됩니다.

**참고**  
다음 예제에서는 고객 관리형 클라이언트 마스터 키로 Amazon S3 클라이언트 측 암호화를 사용하는 방법을 보여 줍니다. AWS KMS 관리형 키로 암호화를 사용하는 방법은 [AWS KMS 관리형 키를 사용한 Amazon S3 클라이언트 측 암호화](examples-crypto-kms.md)를 참조하세요.

클라이언트 측 Amazon S3 암호화를 활성화할 때는 엄격히 인증된 암호화 또는 암호화 등 두 가지 암호화 모드 중에서 선택할 수 있습니다. 다음 단원에서는 각각의 유형을 활성화하는 방법에 대해 설명합니다. 각 모드에서 사용하는 알고리즘은 [CryptoMode](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/CryptoMode.html) 정의를 참조하십시오.

## 필수 가져오기
<a name="required-imports"></a>

이 예제에 사용할 다음 클래스를 가져옵니다.

 **가져옵니다**.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3EncryptionClientV2Builder;
import com.amazonaws.services.s3.AmazonS3EncryptionV2;
import com.amazonaws.services.s3.model.CryptoConfigurationV2;
import com.amazonaws.services.s3.model.CryptoMode;
import com.amazonaws.services.s3.model.EncryptionMaterials;
import com.amazonaws.services.s3.model.StaticEncryptionMaterialsProvider;
```

## 엄격히 인증된 암호화
<a name="strict-authenticated-encryption"></a>

어떠한 `CryptoMode`도 지정되지 않은 경우 엄격한 인증 암호화가 기본 모드입니다.

이 명시적으로 모드를 활성화하려면 `withCryptoConfiguration` 메서드에 `StrictAuthenticatedEncryption` 값을 지정합니다.

**참고**  
클라이언트 측 인증된 암호화를 사용하려면 애플리케이션의 클래스 경로에 최신 [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) 파일을 포함시켜야 합니다.

 ** 코드** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.StrictAuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey)))
         .build();

s3Encryption.putObject(bucket_name, ENCRYPTED_KEY2, "This is the 2nd content to encrypt");
```

## 인증된 암호화 모드
<a name="authenticated-encryption-mode"></a>

`AuthenticatedEncryption` 모드를 사용하여 암호화하면 향상된 키 래핑 알고리즘이 적용됩니다. 이 모드에서 암호를 해독할 때는 이 알고리즘이 해독된 객체의 무결성을 확인하고, 확인에 실패하면 예외가 발생합니다. 인증된 암호화의 작동 방식에 대한 자세한 내용은 [Amazon S3클라이언트 측 인증된 암호화](https://aws.amazon.com/blogs/developer/amazon-s3-client-side-authenticated-encryption) 블로그 게시물을 참조하세요.

**참고**  
클라이언트 측 인증된 암호화를 사용하려면 애플리케이션의 클래스 경로에 최신 [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) 파일을 포함시켜야 합니다.

이 모드를 활성화하려면 `AuthenticatedEncryption` 메서드에 `withCryptoConfiguration` 값을 지정합니다.

 ** 코드** 

```
AmazonS3EncryptionV2 s3EncryptionClientV2 = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.DEFAULT_REGION)
         .withClientConfiguration(new ClientConfiguration())
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.AuthenticatedEncryption))
         .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey)))
         .build();

s3EncryptionClientV2.putObject(bucket_name, ENCRYPTED_KEY1, "This is the 1st content to encrypt");
```

# AWS KMS 관리형 키를 사용한 Amazon S3 클라이언트 측 암호화
<a name="examples-crypto-kms"></a>

다음 예제에서는 [AmazonS3EncryptionClientV2Builder](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/AmazonS3EncryptionClientV2Builder.html) 클래스를 사용하여 클라이언트 측 암호화가 활성화된 Amazon S3 클라이언트를 만듭니다. 이렇게 구성하면 이 클라이언트로 Amazon S3에 업로드하는 모든 객체가 암호화됩니다. 또한 이 클라이언트를 사용하여 Amazon S3에서 가져오는 모든 객체는 자동으로 해독됩니다.

**참고**  
다음 예제에서는 AWS KMS 관리형 키로 Amazon S3 클라이언트 측 암호화를 사용하는 방법을 보여 줍니다. 고객 자체 키로 암호화를 사용하는 방법은 [클라이언트 마스터 키로 Amazon S3 클라이언트 측 암호화](examples-crypto-masterkey.md)를 참조하세요.

클라이언트 측 Amazon S3 암호화를 활성화할 때는 엄격히 인증된 암호화 또는 암호화 등 두 가지 암호화 모드 중에서 선택할 수 있습니다. 다음 단원에서는 각각의 유형을 활성화하는 방법에 대해 설명합니다. 각 모드에서 사용하는 알고리즘은 [CryptoMode](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/model/CryptoMode.html) 정의를 참조하십시오.

## 필수 가져오기
<a name="required-imports"></a>

이 예제에 사용할 다음 클래스를 가져옵니다.

 **가져옵니다**.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.GenerateDataKeyRequest;
import com.amazonaws.services.kms.model.GenerateDataKeyResult;
import com.amazonaws.services.s3.AmazonS3EncryptionClientV2Builder;
import com.amazonaws.services.s3.AmazonS3EncryptionV2;
import com.amazonaws.services.s3.model.CryptoConfigurationV2;
import com.amazonaws.services.s3.model.CryptoMode;
import com.amazonaws.services.s3.model.EncryptionMaterials;
import com.amazonaws.services.s3.model.KMSEncryptionMaterialsProvider;
```

## 엄격히 인증된 암호화
<a name="strict-authenticated-encryption-kms"></a>

어떠한 `CryptoMode`도 지정되지 않은 경우 엄격한 인증 암호화가 기본 모드입니다.

이 명시적으로 모드를 활성화하려면 `withCryptoConfiguration` 메서드에 `StrictAuthenticatedEncryption` 값을 지정합니다.

**참고**  
클라이언트 측 인증된 암호화를 사용하려면 애플리케이션의 클래스 경로에 최신 [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) 파일을 포함시켜야 합니다.

 ** 코드** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.StrictAuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
         .build();

s3Encryption.putObject(bucket_name, ENCRYPTED_KEY3, "This is the 3rd content to encrypt with a key created in the {console}");
System.out.println(s3Encryption.getObjectAsString(bucket_name, ENCRYPTED_KEY3));
```

`putObject` 암호화 클라이언트에서 Amazon S3 메서드를 호출하여 객체를 업로드합니다.

 ** 코드** 

```
s3Encryption.putObject(bucket_name, ENCRYPTED_KEY3, "This is the 3rd content to encrypt with a key created in the {console}");
```

같은 클라이언트를 사용하여 객체를 검색할 수 있습니다. 이 예제에서는 `getObjectAsString` 메서드를 호출하여 저장된 문자열을 검색합니다.

 ** 코드** 

```
System.out.println(s3Encryption.getObjectAsString(bucket_name, ENCRYPTED_KEY3));
```

## 인증된 암호화 모드
<a name="authenticated-encryption-kms"></a>

`AuthenticatedEncryption` 모드를 사용하여 암호화하면 향상된 키 래핑 알고리즘이 적용됩니다. 이 모드에서 암호를 해독할 때는 이 알고리즘이 해독된 객체의 무결성을 확인하고, 확인에 실패하면 예외가 발생합니다. 인증된 암호화의 작동 방식에 대한 자세한 내용은 [Amazon S3클라이언트 측 인증된 암호화](https://aws.amazon.com/blogs/developer/amazon-s3-client-side-authenticated-encryption) 블로그 게시물을 참조하세요.

**참고**  
클라이언트 측 인증된 암호화를 사용하려면 애플리케이션의 클래스 경로에 최신 [Bouncy Castle jar](https://www.bouncycastle.org/download/bouncy-castle-java/) 파일을 포함시켜야 합니다.

이 모드를 활성화하려면 `AuthenticatedEncryption` 메서드에 `withCryptoConfiguration` 값을 지정합니다.

 ** 코드** 

```
AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
         .withRegion(Regions.US_WEST_2)
         .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.AuthenticatedEncryption)))
         .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
         .build();
```

## AWS KMS 클라이언트 구성
<a name="configure-kms"></a>

Amazon S3 암호화 클라이언트는 명시적으로 지정하지 않는 한 기본적으로 AWS KMS 클라이언트를 만듭니다.

자동으로 생성되는 AWS KMS 클라이언트의 지역을 설정하려면 `awsKmsRegion`를 설정합니다.

 ** 코드** 

```
Region kmsRegion = Region.getRegion(Regions.AP_NORTHEAST_1);

AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
        .withRegion(Regions.US_WEST_2)
        .withCryptoConfiguration(new CryptoConfigurationV2().withAwsKmsRegion(kmsRegion))
        .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
        .build();
```

또는 고유한 AWS KMS 클라이언트를 사용하여 암호화 클라이언트를 초기화할 수 있습니다.

 ** 코드** 

```
AWSKMS kmsClient = AWSKMSClientBuilder.standard()
        .withRegion(Regions.US_WEST_2);
        .build();

AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard()
        .withRegion(Regions.US_WEST_2)
        .withKmsClient(kmsClient)
        .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode((CryptoMode.AuthenticatedEncryption)))
        .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId))
        .build();
```