

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

# Java
<a name="ddb-java"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

이 주제에서는 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*를 설치하고 사용하는 방법을 설명합니다. DynamoDB용 AWS Database Encryption SDK를 사용한 프로그래밍에 대한 자세한 내용은 GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에서 [Java 예제](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples)를 참조하세요.

**참고**  
다음 주제에서는 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*에 중점을 둡니다.  
클라이언트측 암호화 라이브러리의 [이름이 AWS Database Encryption SDK로 변경되었습니다](DDBEC-rename.md). AWS Database Encryption SDK는 [레거시 DynamoDB Encryption Client 버전을](legacy-dynamodb-encryption-client.md) 계속 지원합니다.

**Topics**
+ [사전 조건](#ddb-java-prerequisites)
+ [설치](#ddb-java-installation)
+ [Java 클라이언트 사용](ddb-java-using.md)
+ [Java 예제](ddb-java-examples.md)
+ [기존 테이블에 버전 3.x 추가](ddb-java-config-existing-table.md)
+ [버전 3.x로 마이그레이션](ddb-java-migrate.md)

## 사전 조건
<a name="ddb-java-prerequisites"></a>

버전 3.*x*을 설치하기 전에 DynamoDB용 Java 클라이언트측 암호화 라이브러리의 경우 다음과 같은 사전 요구 사항이 있는지 확인합니다.

**Java 개발 환경**  
Java 8 이상이 필요합니다. Oracle 웹 사이트에서 [Java SE 다운로드](https://www.oracle.com/java/technologies/downloads/)로 이동한 다음 Java SE Development Kit(JDK)를 다운로드하여 설치합니다.  
Oracle JDK를 사용하는 경우 [Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy File](http://www.oracle.com/java/technologies/javase-jce8-downloads.html)도 다운로드하여 설치해야 합니다.

**AWS SDK for Java 2.x**  
 AWS Database Encryption SDK for DynamoDB에는의 [DynamoDB 향상된 클라이언트](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html) 모듈이 필요합니다 AWS SDK for Java 2.x. 전체 SDK를 설치하거나 이 모듈만 설치할 수 있습니다.  
버전 업데이트에 대한 자세한 내용은의 버전 1.x에서 2.x로 마이그레이션을 AWS SDK for Java참조하세요. [AWS SDK for Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html)   
 AWS SDK for Java 는 Apache Maven을 통해 사용할 수 있습니다. 전체 AWS SDK for Java또는 `dynamodb-enhanced` 모듈에 대한 종속성을 선언할 수 있습니다.  

**Apache Maven을 AWS SDK for Java 사용하여 설치**
+ [전체 AWS SDK for Java를 종속성으로 가져오려면](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#build-the-entire-sdk-into-your-project) `pom.xml` 파일에 선언하세요.
+  AWS SDK for Java에서 Amazon DynamoDB 모듈에 대해서만 종속성을 생성하려면 [특정 모듈을 지정](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#modules-dependencies)하는 지침을 따릅니다. `groupId`를 `software.amazon.awssdk`로, `artifactID`를 `dynamodb-enhanced`로 설정합니다.
**참고**  
 AWS KMS 키링 또는 AWS KMS 계층적 키링을 사용하는 경우 AWS KMS 모듈에 대한 종속성도 생성해야 합니다. `groupId`를 `software.amazon.awssdk`로, `artifactID`를 `kms`로 설정합니다.

## 설치
<a name="ddb-java-installation"></a>

다음 방법으로 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*를 설치할 수 있습니다.

**Apache Maven 사용**  
Amazon DynamoDB Encryption Client for Java는 다음 종속성 정의와 함께 [Apache Maven](https://maven.apache.org/)을 통해 사용할 수 있습니다.  

```
<dependency>
  <groupId>software.amazon.cryptography</groupId>
  <artifactId>aws-database-encryption-sdk-dynamodb</artifactId>
  <version>version-number</version>
</dependency>
```

**Gradle Kotlin 사용**  
[Gradle](https://gradle.org/)을 사용하면 Gradle 프로젝트의 *종속성* 섹션에 다음을 추가하여 Java용 Amazon DynamoDB Encryption Client에 대한 종속성을 선언할 수 있습니다.  

```
implementation("software.amazon.cryptography:aws-database-encryption-sdk-dynamodb:version-number")
```

**직접**  
DynamoDB용 Java 클라이언트 측 암호화 라이브러리를 설치하려면 [aws-database-encryption-sdk-dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) GitHub 리포지토리를 복제하거나 다운로드합니다.

SDK를 설치한 후이 가이드의 예제 코드와 GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에 있는 [Java 예제](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples)를 살펴보면서 시작합니다.

# DynamoDB용 Java 클라이언트측 암호화 라이브러리 사용
<a name="ddb-java-using"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

이 주제에서는 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*의 일부 기능과 헬퍼 클래스에 대해 설명합니다.

DynamoDB용 Java 클라이언트 측 암호화 라이브러리를 사용한 프로그래밍에 대한 자세한 내용은 GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에 있는 [Java 예제](java-examples.md)인 [Java 예제](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples)를 참조하세요.

**Topics**
+ [항목 암호화 도구](#ddb-item-encryptors)
+ [속성 작업](#ddb-attribute-actions)
+ [암호화 구성](#ddb-config-encrypt)
+ [항목 업데이트](#ddb-update-items)
+ [서명된 집합 암호 해독](#ddb-java-signed-sets)

## 항목 암호화 도구
<a name="ddb-item-encryptors"></a>

코어에서 AWS Database Encryption SDK for DynamoDB는 항목 암호화 도구입니다. DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x* 를 사용하여 다음과 같은 방법으로 DynamoDB 테이블 항목을 암호화, 서명, 확인 및 복호화할 수 있습니다.

**DynamoDB Enhanced Client**  
`DynamoDbEncryptionInterceptor`를 사용하여 DynamoDB `PutItem` 요청에 따라 클라이언트측에서 항목을 자동으로 암호화하고 서명하도록 [DynamoDB Enhanced Client](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html)를 구성할 수 있습니다. DynamoDB Enhanced Client에서는 [주석이 달린 데이터 클래스](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean)를 사용하여 속성 작업을 정의할 수 있습니다. 가능하면 DynamoDB Enhanced Client를 사용하는 것이 좋습니다.  
DynamoDB Enhanced Client는 [검색 가능한 암호화](searchable-encryption.md)를 지원하지 않습니다.  
 AWS Database Encryption SDK는 [중첩 속성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html)에 대한 주석을 지원하지 않습니다.

**하위 수준 DynamoDB API**  
`DynamoDbEncryptionInterceptor`를 사용하여 DynamoDB `PutItem` 요청에 따라 클라이언트측에서 항목을 자동으로 암호화하고 서명하도록 [하위 수준 DynamoDB API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html)를 구성할 수 있습니다.  
[검색 가능한 암호화](searchable-encryption.md)를 사용하려면 하위 수준 DynamoDB API를 사용해야 합니다.

**하위 수준 `DynamoDbItemEncryptor`**  
하위 수준 `DynamoDbItemEncryptor`에서는 DynamoDB를 호출하지 않고도 테이블 항목을 직접 암호화하고 서명 또는 복호화하고 확인합니다. DynamoDB `PutItem` 또는 `GetItem` 요청을 하지 않습니다. 예를 들어 하위 수준 `DynamoDbItemEncryptor`을 사용하여 이미 검색한 DynamoDB 항목을 직접 복호화하고 확인할 수 있습니다.  
하위 수준 `DynamoDbItemEncryptor`은 [검색 가능한 암호화](searchable-encryption.md)를 지원하지 않습니다.

## AWS Database Encryption SDK for DynamoDB의 속성 작업
<a name="ddb-attribute-actions"></a>

[속성 작업은](concepts.md#crypt-actions) 암호화 및 서명되는 속성 값, 서명만 되는 속성 값, 암호화 컨텍스트에 서명 및 포함되는 속성 값, 무시되는 속성 값을 결정합니다.

**참고**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 암호화 작업을 사용하려면 AWS Database Encryption SDK 버전 3.3 이상을 사용해야 합니다. 를 포함하도록 [데이터 모델을 업데이트하기 전에 모든 리더](ddb-update-data-model.md)에 새 버전을 배포합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

하위 수준 DynamoDB API 또는 하위 수준 `DynamoDbItemEncryptor`을 사용하는 경우 속성 작업을 수동으로 정의해야 합니다. DynamoDB Enhanced Client를 사용하는 경우 속성 작업을 수동으로 정의하거나 주석이 달린 데이터 클래스를 사용하여 [`TableSchema`을 생성할 수 있습니다](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html). 구성 프로세스를 단순화하려면 주석이 달린 데이터 클래스를 사용하는 것이 좋습니다. 주석이 달린 데이터 클래스를 사용하는 경우 객체를 한 번만 모델링하면 됩니다.

**참고**  
속성 작업을 정의한 후에는 서명에서 제외할 속성을 정의해야 합니다. 나중에 서명되지 않은 새 속성을 더 쉽게 추가할 수 있도록 서명되지 않은 속성을 식별할 고유한 접두사(예: "`:`“)를 선택하는 것이 좋습니다. DynamoDB 스키마와 속성 작업을 정의할 때 `DO_NOTHING`로 표시된 모든 속성의 속성 이름에 이 접두사를 포함합니다.

### 주석이 달린 데이터 클래스 사용
<a name="ddb-attribute-actions-annotated-data-class"></a>

[주석이 달린 데이터 클래스](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean)를 사용하여 DynamoDB Enhanced Client 및 `DynamoDbEncryptionInterceptor`에서 속성 작업을 지정합니다. AWS Database Encryption SDK for DynamoDB는 속성 유형을 정의하는 [표준 DynamoDB 속성 주석](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/mapper/annotations/package-summary.html)을 사용하여 속성을 보호하는 방법을 결정합니다. 기본적으로 기본 키(서명되지만 암호화되지 않음)를 제외하고는 모든 속성이 암호화 및 서명됩니다.

**참고**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 암호화 작업을 사용하려면 AWS Database Encryption SDK 버전 3.3 이상을 사용해야 합니다. 를 포함하도록 [데이터 모델을 업데이트하기 전에 모든 리더](ddb-update-data-model.md)에 새 버전을 배포합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

DynamoDB 향상된 클라이언트 주석에 대한 자세한 지침은 GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에서 [SimpleClass.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java)를 참조하세요.

기본적으로 프라이머리 키 속성은 서명되지만 암호화되지는 않으며(`SIGN_ONLY`) 다른 모든 속성은 암호화되고 서명됩니다(`ENCRYPT_AND_SIGN`). 속성을 로 정의하는 경우 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. 예외를 지정하려면 DynamoDB용 Java 클라이언트측 암호화 라이브러리에 정의된 암호화 주석을 사용합니다. 예를 들어, 특정 속성에 서명만 적용하려면 `@DynamoDbEncryptionSignOnly` 주석을 사용합니다. 특정 속성을 서명하여 암호화 컨텍스트에 포함하려면를 사용합니다`@DynamoDbEncryptionSignAndIncludeInEncryptionContext`. 특정 속성에 서명되거나 암호화되지 않도록 하려면(`DO_NOTHING`) `@DynamoDbEncryptionDoNothing` 주석을 사용합니다.

**참고**  
 AWS Database Encryption SDK는 [중첩 속성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html)에 대한 주석을 지원하지 않습니다.

다음 예제에서는 `ENCRYPT_AND_SIGN`, `SIGN_ONLY`및 `DO_NOTHING`속성 작업을 정의하는 데 사용되는 주석을 보여줍니다. 를 정의하는 데 사용되는 주석을 보여주는 예제는 [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java)를 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`참조하세요.

```
@DynamoDbBean
public class SimpleClass {

    private String partitionKey;
    private int sortKey;
    private String attribute1;
    private String attribute2;
    private String attribute3;

    @DynamoDbPartitionKey
    @DynamoDbAttribute(value = "partition_key")
    public String getPartitionKey() {
        return this.partitionKey;
    }

    public void setPartitionKey(String partitionKey) {
        this.partitionKey = partitionKey;
    }

    @DynamoDbSortKey
    @DynamoDbAttribute(value = "sort_key")
    public int getSortKey() {
        return this.sortKey;
    }

    public void setSortKey(int sortKey) {
        this.sortKey = sortKey;
    }

    public String getAttribute1() {
        return this.attribute1;
    }

    public void setAttribute1(String attribute1) {
        this.attribute1 = attribute1;
    }

    @DynamoDbEncryptionSignOnly
    public String getAttribute2() {
        return this.attribute2;
    }

    public void setAttribute2(String attribute2) {
        this.attribute2 = attribute2;
    }

    @DynamoDbEncryptionDoNothing
    public String getAttribute3() {
        return this.attribute3;
    }

    @DynamoDbAttribute(value = ":attribute3")
    public void setAttribute3(String attribute3) {
        this.attribute3 = attribute3;
    }
    
}
```

주석이 달린 데이터 클래스를 사용하여 다음 코드 조각에 표시된 것처럼 `TableSchema`을 생성합니다.

```
final TableSchema<SimpleClass> tableSchema = TableSchema.fromBean(SimpleClass.class);
```

### 속성 작업 수동 정의
<a name="ddb-attribute-actions-manual"></a>

속성 작업을 수동으로 지정하려면 이름-값 페어가 속성 이름과 지정된 작업을 나타내는 `Map` 객체를 만듭니다.

속성을 암호화하고 서명하도록 `ENCRYPT_AND_SIGN`을 지정합니다. 속성을 서명하되 암호화하지 않도록 `SIGN_ONLY`을 지정합니다. 를 지정`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`하여 속성에 서명하고 암호화 컨텍스트에 포함합니다. 서명하지 않으면 속성을 암호화할 수 없습니다. 속성을 무시하도록 `DO_NOTHING`을 지정합니다.

파티션 및 정렬 속성은 `SIGN_ONLY` 또는 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. 속성을 로 정의하는 경우 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**참고**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 암호화 작업을 사용하려면 AWS Database Encryption SDK 버전 3.3 이상을 사용해야 합니다. 를 포함하도록 [데이터 모델을 업데이트하기 전에 모든 리더](ddb-update-data-model.md)에 새 버전을 배포합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be signed
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); 
// The sort attribute must be signed
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put("attribute3", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT);
attributeActionsOnEncrypt.put(":attribute4", CryptoAction.DO_NOTHING);
```

## AWS Database Encryption SDK for DynamoDB의 암호화 구성
<a name="ddb-config-encrypt"></a>

 AWS Database Encryption SDK를 사용하는 경우 DynamoDB 테이블에 대한 암호화 구성을 명시적으로 정의해야 합니다. 암호화 구성에 필요한 값은 속성 작업을 수동으로 정의했는지 아니면 주석이 달린 데이터 클래스를 사용하여 정의했는지에 따라 달라집니다.

다음 스니펫은 DynamoDB Enhanced Client [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html)를 사용하는 DynamoDB 테이블 암호화 구성을 정의하고 고유한 접두사로 정의된 서명되지 않은 속성을 허용합니다.

```
final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
tableConfigs.put(ddbTableName,
        DynamoDbEnhancedTableEncryptionConfig.builder()
            .logicalTableName(ddbTableName)
            .keyring(kmsKeyring)
            .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
            .schemaOnEncrypt(tableSchema)
            // Optional: only required if you use beacons
            .search(SearchConfig.builder() 
                    .writeVersion(1) // MUST be 1
                    .versions(beaconVersions)
                    .build())         
            .build());
```

**논리적 테이블 이름**  
DynamoDB 테이블의 논리적 테이블 이름.  
논리적 테이블 이름은 테이블에 저장된 모든 데이터에 암호로 바인딩되어 DynamoDB 복원 작업을 간소화합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 항상 같은 논리적 테이블 이름을 지정해야 합니다. 복호화이 성공하려면 논리적 테이블 이름이 암호화에 지정된 이름과 일치해야 합니다. [백업에서 DynamoDB 테이블을 복원](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html)한 후 DynamoDB 테이블 이름이 변경되더라도 논리적 테이블 이름을 사용하면 복호화 작업에서 테이블을 계속 인식할 수 있습니다.

**허용된 서명되지 않은 속성**  
속성 작업에 `DO_NOTHING`로 표시된 속성.  
허용된 무서명 서명에서 제외되는 속성을 클라이언트에게 알려줍니다. 클라이언트는 다른 모든 속성이 서명에 포함되어 있다고 가정합니다. 그런 다음 레코드를 복호화할 때 클라이언트는 확인해야 할 속성과 지정한 허용된 무서명 속성 중에서 무시할 속성을 결정합니다. 허용된 무서명 속성에서는 속성을 제거할 수 없습니다.  
모든 `DO_NOTHING` 속성을 나열하는 배열을 만들어 무서명 허용 속성을 명시적으로 정의할 수 있습니다. `DO_NOTHING` 속성의 이름을 지정할 때 고유한 접두사를 지정하고 이 접두사를 사용하여 무서명 속성을 클라이언트에게 알릴 수도 있습니다. 고유한 접두사를 지정하는 것이 좋습니다. 이렇게 하면 나중에 새 `DO_NOTHING` 속성을 추가하는 프로세스가 단순해지기 때문입니다. 자세한 내용은 [데이터 모델 업데이트](ddb-update-data-model.md) 단원을 참조하십시오.  
모든 `DO_NOTHING` 속성에 접두사를 지정하지 않는 경우 클라이언트가 복호화 시 서명되지 않을 것으로 예상되는 모든 속성을 명시적으로 나열하는 `allowedUnsignedAttributes` 배열을 구성할 수 있습니다. 반드시 필요한 경우에만 허용된 서명되지 않은 속성을 명시적으로 정의해야 합니다.

**검색 구성(선택 사항)**  
`SearchConfig`는 [비컨 버전](using-beacons.md#beacon-version)을 정의합니다.  
[검색 가능한 암호화](searchable-encryption.md) 또는 [서명된 비컨](configure.md#signed-beacons)을 사용하려면 `SearchConfig`를 지정해야 합니다.

**알고리즘 제품군(선택 사항)**  
`algorithmSuiteId`은 AWS Database Encryption SDK가 사용하는 알고리즘 제품군을 정의합니다.  
대체 알고리즘 제품군을 명시적으로 지정하지 않는 한 AWS Database Encryption SDK는 [기본 알고리즘 제품군](supported-algorithms.md#recommended-algorithms)을 사용합니다. 기본 알고리즘 제품군은 키 도출, [디지털 서명](concepts.md#digital-sigs) 및 [키 커밋](concepts.md#key-commitment)과 함께 AES-GCM 알고리즘을 사용합니다. 기본 알고리즘 제품군이 대부분의 애플리케이션에 적합할 가능성이 높지만 대체 알고리즘 제품군을 선택할 수도 있습니다. 예를 들어, 일부 신뢰 모델은 디지털 서명이 없는 알고리즘 제품군으로 충분할 수 있습니다. AWS Database Encryption SDK가 지원하는 알고리즘 제품군에 대한 자세한 내용은 섹션을 참조하세요[AWS Database Encryption SDK에서 지원되는 알고리즘 제품군](supported-algorithms.md).  
[ECDSA 디지털 서명이 없는 AES-GCM 알고리즘 제품군을](supported-algorithms.md#other-algorithms) 선택하려면 테이블 암호화 구성에 다음 코드 조각을 포함합니다.  

```
.algorithmSuiteId(
    DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)
```

## AWS Database Encryption SDK로 항목 업데이트
<a name="ddb-update-items"></a>

 AWS Database Encryption SDK는 암호화되거나 서명된 항목에 대해 [ddb:UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)을 지원하지 않습니다. 암호화되거나 서명된 항목을 업데이트하려면 [ddb:PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)을 사용해야 합니다. `PutItem` 요청에 기존 항목과 동일한 프라이머리 키를 지정하면 새 항목이 기존 항목을 완전히 대체합니다. 항목을 업데이트한 후 [CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER)를 사용하여 저장 시 모든 속성을 지우고 바꿀 수도 있습니다.

## 서명된 집합 암호 해독
<a name="ddb-java-signed-sets"></a>

 AWS Database Encryption SDK 버전 3.0.0 및 3.1.0에서는 [세트 유형](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes) 속성을 로 정의하면 세트의 `SIGN_ONLY`값이 제공된 순서대로 정식화됩니다. DynamoDB는 집합의 순서를 보존하지 않습니다. 따라서 집합을 포함하는 항목의 서명 검증이 실패할 수 있습니다. 집합 속성에 동일한 값이 포함되어 있더라도 집합의 값이 AWS Database Encryption SDK에 제공된 것과 다른 순서로 반환되면 서명 검증이 실패합니다.

**참고**  
 AWS Database Encryption SDK 버전 3.1.1 이상에서는 모든 세트 유형 속성의 값을 정규화하므로 DynamoDB에 기록된 것과 동일한 순서로 값을 읽을 수 있습니다.

서명 검증이 실패하는 경우 암호 해독 작업이 실패하고 다음 오류 메시지가 반환됩니다.


|  | 
| --- |
| software.amazon.cryptography.dbencryptionsdk.structuredencryption.model.StructuredEncryptionException: 일치하는 수신자 태그가 없습니다. | 

위의 오류 메시지가 표시되고 암호 해독하려는 항목에 버전 3.0.0 또는 3.1.0을 사용하여 서명된 세트가 포함되어 있다고 생각되는 경우, GitHub에 있는 aws-database-encryption-sdk-dynamodb-java 리포지토리의 [DecryptWithPermute](https://github.com/aws/aws-database-encryption-sdk-dynamodb-java/tree/v3.1.1/DecryptWithPermute) 디렉터리에서 집합을 성공적으로 검증하는 방법에 대한 자세한 내용을 참조하세요.

# Java 예제
<a name="ddb-java-examples"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

다음 예제에서는 DynamoDB용 Java 클라이언트측 암호화 라이브러리를 사용하여 애플리케이션의 테이블 항목을 보호하는 방법을 보여줍니다. GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에 있는 [Java 예제](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples)에서 더 많은 예제를 찾을 수 있습니다(자체 예제를 제공할 수 있습니다).

다음 예제는 채워지지 않은 새 Amazon DynamoDB 테이블에서 DynamoDB용 Java 클라이언트측 암호화 라이브러리를 구성하는 방법을 보여줍니다. 클라이언트측 암호화를 위해 기존 Amazon DynamoDB 테이블을 구성하려면 [기존 테이블에 버전 3.x 추가](ddb-java-config-existing-table.md) 섹션을 참조하세요.

**Topics**
+ [DynamoDB Enhanced Client 사용](#ddb-java-enhanced-client-example)
+ [하위 수준 DynamoDB API 사용](#ddb-java-lowlevel-API-example)
+ [하위 수준 DynamoDbItemEncryptor 사용](#ddb-java-itemencryptor)

## DynamoDB Enhanced Client 사용
<a name="ddb-java-enhanced-client-example"></a>

다음 예제는 DynamoDB API 호출의 일부로 DynamoDB Enhanced Client와 [AWS KMS 키링](use-kms-keyring.md)을 포함한 `DynamoDbEncryptionInterceptor`을 사용하여 DynamoDB 테이블 항목을 암호화하는 방법을 보여줍니다.

DynamoDB Enhanced Client에서 지원되는 모든 [키링](keyrings.md)을 사용할 수 있지만 가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다.

**참고**  
DynamoDB Enhanced Client는 [검색 가능한 암호화](searchable-encryption.md)를 지원하지 않습니다. 하위 수준 DynamoDB API와 함께 `DynamoDbEncryptionInterceptor`을 사용하여 검색 가능한 암호화를 사용할 수 있습니다.

**전체 코드 샘플 보기**: [EnhancedPutGetExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/EnhancedPutGetExample.java)

**1단계: AWS KMS 키링 생성**  
다음 예제에서는 `CreateAwsKmsMrkMultiKeyring`를 사용하여 대칭 암호화 KMS AWS KMS 키로 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
final MaterialProviders matProv = MaterialProviders.builder()
        .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
        .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**2단계: 주석이 달린 데이터 클래스에서 테이블 스키마 생성**  
다음 예제에서는 주석이 달린 데이터 클래스를 사용하여 `TableSchema`를 만듭니다.  
이 예제에서는 주석이 달린 데이터 클래스와 속성 작업을 [SimpleClass.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java)를 사용하여 정의했다고 가정합니다. 속성 작업에 주석을 다는 방법에 대한 자세한 지침은 [주석이 달린 데이터 클래스 사용](ddb-java-using.md#ddb-attribute-actions-annotated-data-class)을 참조하세요.  
 AWS Database Encryption SDK는 [중첩 속성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html)에 대한 주석을 지원하지 않습니다.

```
final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);
```

**3단계: 시그니처에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름이 서명에서 제외된다고 가정합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth) 단원을 참조하십시오.  

```
final String unsignedAttrPrefix = ":";
```

**4단계: 암호화 구성 생성**  
다음 예제는 DynamoDB 테이블의 암호화 구성을 나타내는 `tableConfigs` 맵을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-java-using.md#logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-java-using.md#ddb-config-encrypt) 단원을 참조하십시오.  
[검색 가능한 암호화](searchable-encryption.md) 또는 [서명된 비컨](configure.md#signed-beacons)을 사용하려면 암호화 구성에도 [`SearchConfig`](ddb-java-using.md#ddb-search-config)을 포함해야 합니다.

```
final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
tableConfigs.put(ddbTableName,
    DynamoDbEnhancedTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .schemaOnEncrypt(tableSchema)
        .build());
```

**5단계: `DynamoDbEncryptionInterceptor` 생성**  
다음 예제에서는 **4단계**의 `tableConfigs`를 사용하여 새 `DynamoDbEncryptionInterceptor`을 만듭니다.  

```
final DynamoDbEncryptionInterceptor interceptor =
    DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
        CreateDynamoDbEncryptionInterceptorInput.builder()
            .tableEncryptionConfigs(tableConfigs)
            .build()
    );
```

**6단계: 새 AWS SDK DynamoDB 클라이언트 생성**  
다음 예제에서는 **5단계**`interceptor`의를 사용하여 새 AWS SDK DynamoDB 클라이언트를 생성합니다.  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**7단계: DynamoDB Enhanced Client 생성 및 테이블 생성**  
다음 예제는 **6단**계에서 생성한 AWS SDK DynamoDB client를 사용하여 DynamoDB Enhanced Client를 생성하고 주석이 달린 데이터 클래스를 사용하여 테이블을 생성합니다.  

```
final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
        .dynamoDbClient(ddb)
        .build();
final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
```

**8단계: 테이블 항목 암호화 및 서명**  
다음 예제는 DynamoDB Enhanced Client를 사용하여 DynamoDB 테이블에 항목을 추가합니다. 항목은 DynamoDB로 전송되기 전에 클라이언트측에서 암호화되고 서명됩니다.  

```
final SimpleClass item = new SimpleClass();
item.setPartitionKey("EnhancedPutGetExample");
item.setSortKey(0);
item.setAttribute1("encrypt and sign me!");
item.setAttribute2("sign me!");
item.setAttribute3("ignore me!");

table.putItem(item);
```

## 하위 수준 DynamoDB API 사용
<a name="ddb-java-lowlevel-API-example"></a>

다음 예제는 [AWS KMS 키링](use-kms-keyring.md)이 있는 하위 수준 DynamoDB API를 사용하여 DynamoDB `PutItem` 요청으로 클라이언트측에서 항목을 자동으로 암호화하고 서명하는 방법을 보여줍니다.

지원되는 모든 [키링](keyrings.md)을 사용할 수 있지만 가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다.

**전체 코드 샘플 보기**: [BasicPutGetExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/BasicPutGetExample.java)

**1단계: AWS KMS 키링 생성**  
다음 예제에서는 `CreateAwsKmsMrkMultiKeyring`를 사용하여 대칭 암호화 KMS AWS KMS 키로 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**2단계: 속성 작업 구성**  
다음 예제에서는 테이블 항목에 대한 샘플 [속성 작업](concepts.md#crypt-actions)을 나타내는 `attributeActionsOnEncrypt` 맵을 정의합니다.  
다음 예제에서는 속성을 로 정의하지 않습니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**3단계: 시그니처에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름이 서명에서 제외된다고 가정합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth) 단원을 참조하십시오.  

```
final String unsignedAttrPrefix = ":";
```

**4단계: DynamoDB 테이블 암호화 구성 정의**  
다음 예제는 이 DynamoDB 테이블의 암호화 구성을 나타내는 `tableConfigs` 맵을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-java-using.md#logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-java-using.md#ddb-config-encrypt) 단원을 참조하십시오.  
[검색 가능한 암호화](searchable-encryption.md) 또는 [서명된 비컨](configure.md#signed-beacons)을 사용하려면 암호화 구성에도 [`SearchConfig`](ddb-java-using.md#ddb-search-config)을 포함해야 합니다.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
tableConfigs.put(ddbTableName, config);
```

**5단계: `DynamoDbEncryptionInterceptor` 생성**  
다음 예제는 **4단계**의 `tableConfigs`를 사용하여 `DynamoDbEncryptionInterceptor`을 생성합니다.  

```
DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder()
        .config(DynamoDbTablesEncryptionConfig.builder()
                .tableEncryptionConfigs(tableConfigs)
                .build())
        .build();
```

**6단계: 새 AWS SDK DynamoDB 클라이언트 생성**  
다음 예제에서는 **5단계**`interceptor`의를 사용하여 새 AWS SDK DynamoDB 클라이언트를 생성합니다.  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**7단계: DynamoDB 테이블 항목 암호화 및 서명**  
다음 예제는 샘플 테이블 항목을 나타내는 `item` 맵을 정의하고 해당 항목을 DynamoDB 테이블에 배치합니다. 항목은 DynamoDB로 전송되기 전에 클라이언트측에서 암호화되고 서명됩니다.  

```
final HashMap<String, AttributeValue> item = new HashMap<>();
item.put("partition_key", AttributeValue.builder().s("BasicPutGetExample").build());
item.put("sort_key", AttributeValue.builder().n("0").build());
item.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
item.put("attribute2", AttributeValue.builder().s("sign me!").build());
item.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final PutItemRequest putRequest = PutItemRequest.builder()
        .tableName(ddbTableName)
        .item(item)
        .build();

final PutItemResponse putResponse = ddb.putItem(putRequest);
```

## 하위 수준 DynamoDbItemEncryptor 사용
<a name="ddb-java-itemencryptor"></a>

다음 예제는 [AWS KMS 키링](use-kms-keyring.md)이 있는 하위 수준 `DynamoDbItemEncryptor`을 사용하여 테이블 항목을 직접 암호화하고 서명하는 방법을 보여줍니다. `DynamoDbItemEncryptor`는 DynamoDB 테이블에 항목을 배치하지 않습니다.

DynamoDB Enhanced Client에서 지원되는 모든 [키링](keyrings.md)을 사용할 수 있지만 가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다.

**참고**  
하위 수준 `DynamoDbItemEncryptor`은 [검색 가능한 암호화](searchable-encryption.md)를 지원하지 않습니다. 하위 수준 DynamoDB API와 함께 `DynamoDbEncryptionInterceptor`을 사용하여 검색 가능한 암호화를 사용할 수 있습니다.

**전체 코드 샘플 보기**: [ItemEncryptDecryptExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/itemencryptor/ItemEncryptDecryptExample.java)

**1단계: AWS KMS 키링 생성**  
다음 예제에서는 `CreateAwsKmsMrkMultiKeyring`를 사용하여 대칭 암호화 KMS AWS KMS 키로 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**2단계: 속성 작업 구성**  
다음 예제에서는 테이블 항목에 대한 샘플 [속성 작업](concepts.md#crypt-actions)을 나타내는 `attributeActionsOnEncrypt` 맵을 정의합니다.  
다음 예제에서는 속성을 로 정의하지 않습니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**3단계: 시그니처에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름이 서명에서 제외된다고 가정합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth) 단원을 참조하십시오.  

```
final String unsignedAttrPrefix = ":";
```

**4단계: `DynamoDbItemEncryptor` 구성 정의**  
다음 예제에서는 `DynamoDbItemEncryptor`의 구성을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-java-using.md#logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-java-using.md#ddb-config-encrypt) 단원을 참조하십시오.  

```
final DynamoDbItemEncryptorConfig config = DynamoDbItemEncryptorConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
```

**5단계: `DynamoDbItemEncryptor` 생성**  
다음 예제에서는 **4단계**의 `config`를 사용하여 새 `DynamoDbItemEncryptor`을 만듭니다.  

```
final DynamoDbItemEncryptor itemEncryptor = DynamoDbItemEncryptor.builder()
        .DynamoDbItemEncryptorConfig(config)
        .build();
```

**6단계: 테이블 항목을 직접 암호화하고 서명합니다.**  
다음 예제에서는 `DynamoDbItemEncryptor`를 사용하여 항목을 직접 암호화하고 서명합니다. `DynamoDbItemEncryptor`는 DynamoDB 테이블에 항목을 배치하지 않습니다.  

```
final Map<String, AttributeValue> originalItem = new HashMap<>();
originalItem.put("partition_key", AttributeValue.builder().s("ItemEncryptDecryptExample").build());
originalItem.put("sort_key", AttributeValue.builder().n("0").build());
originalItem.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
originalItem.put("attribute2", AttributeValue.builder().s("sign me!").build());
originalItem.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final Map<String, AttributeValue> encryptedItem = itemEncryptor.EncryptItem(
        EncryptItemInput.builder()
                .plaintextItem(originalItem)
                .build()
).encryptedItem();
```

# DynamoDB용 AWS Database Encryption SDK를 사용하도록 기존 DynamoDB 테이블 구성
<a name="ddb-java-config-existing-table"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

버전 3.*x*를 포함하여 DynamoDB용 Java 클라이언트측 암호화 라이브러리 중 하나를 사용하면 기존 Amazon DynamoDB 테이블을 클라이언트측 암호화를구성할 수 있습니다. 이 주제에서는 채워진 기존 DynamoDB 테이블에 버전 3.*x*를 추가하기 위해 수행해야 하는 세 가지 단계에 대한 지침을 제공합니다.

**사전 조건**  
DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*에는 AWS SDK for Java 2.x 에서 제공하는 [DynamoDB Enhanced Client](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html)가 필요합니다. [DynamoDBMapper](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html)를 계속 사용하는 경우 DynamoDB Enhanced Client를 사용하려면 AWS SDK for Java 2.x 로 마이그레이션해야 합니다.

 [AWS SDK for Java의 버전 1.x에서 2.x로 마이그레이션하기](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html) 지침을 따르세요.

그런 다음 [DynamoDB Enhanced Client API를 사용하여 시작하기](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started.html) 지침을 따르세요.

DynamoDB용 Java 클라이언트측 암호화 라이브러리를 사용하도록 테이블을 구성하기 전에 `TableSchema` [주석이 달린 데이터 클래스를 사용](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean)을 생성하고 [ 고급 클라이언트를 생성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient)해야 합니다.

## 1단계: 암호화된 항목 읽기 및 쓰기 준비
<a name="ddb-java-add-step1"></a>

다음 단계를 완료하여 AWS Database Encryption SDK 클라이언트가 암호화된 항목을 읽고 쓸 수 있도록 준비합니다. 다음 변경사항을 배포한 후에도 클라이언트는 계속해서 일반 텍스트 항목을 읽고 씁니다. 테이블에 기록된 새 항목을 암호화하거나 서명하지는 않지만 암호화된 항목이 나타나는 즉시 복호화할 수 있습니다. 이러한 변경으로 인해 클라이언트는 [새 항목의 암호화](#ddb-java-add-step2)를 시작할 수 있습니다. 다음 단계로 진행하기 전에 각 리더에 다음 변경 내용을 배포해야 합니다.

**1. [속성 작업](concepts.md#crypt-actions) 정의**  
암호화 및 서명할 속성 값, 서명만 가능한 속성 값, 무시할 속성 값을 정의하는 속성 작업을 포함하도록 주석이 달린 데이터 클래스를 업데이트합니다.  
DynamoDB 향상된 클라이언트 주석에 대한 자세한 지침은 GitHub의 aws-database-encryption-sdk-dynamodb 리포지토리에서 [SimpleClass.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java)를 참조하세요.  
기본적으로 프라이머리 키 속성은 서명되지만 암호화되지는 않으며(`SIGN_ONLY`) 다른 모든 속성은 암호화되고 서명됩니다(`ENCRYPT_AND_SIGN`). 예외를 지정하려면 DynamoDB용 Java 클라이언트측 암호화 라이브러리에 정의된 암호화 주석을 사용합니다. 예를 들어, 특정 속성에 서명되도록 하려면 `@DynamoDbEncryptionSignOnly` 주석만 사용합니다. 특정 속성에 서명하고 암호화 컨텍스트에 포함하려면 `@DynamoDbEncryptionSignAndIncludeInEncryptionContext` 주석을 사용합니다. 특정 속성에 서명되거나 암호화되지 않도록 하려면(`DO_NOTHING`) `@DynamoDbEncryptionDoNothing` 주석을 사용합니다.  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. 를 정의하는 데 사용되는 주석을 보여주는 예제는 [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java)를 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`참조하세요.
주석의 예제는 [주석이 달린 데이터 클래스 사용](ddb-java-using.md#ddb-attribute-actions-annotated-data-class) 섹션을 참조하세요.

**2. 서명에서 제외할 속성을 정의합니다.**  
다음 예제에서는 모든 `DO_NOTHING` 속성이 고유한 접두사 "`:`“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 "`:`"인 모든 속성 이름은 서명에서 제외된 것으로 간주합니다. 자세한 내용은 [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth) 단원을 참조하십시오.  

```
final String unsignedAttrPrefix = ":";
```

**3. [키링](keyrings.md) 생성**  
다음 예제에서는 [AWS KMS 키링](use-kms-keyring.md)을 생성합니다. AWS KMS 키링은 대칭 암호화 또는 비대칭 RSA AWS KMS keys 를 사용하여 데이터 키를 생성, 암호화 및 복호화합니다.  
이 예제에서는 `CreateMrkMultiKeyring`를 사용하여 대칭 암호화 KSM 키를 포함한 AWS KMS 키링을 생성합니다. 이 `CreateAwsKmsMrkMultiKeyring` 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.  

```
final MaterialProviders matProv = MaterialProviders.builder()
        .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
        .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**4. DynamoDB 테이블 암호화 구성 정의 **  
다음 예제는 이 DynamoDB 테이블의 암호화 구성을 나타내는 `tableConfigs` 맵을 정의합니다.  
이 예제에서는 DynamoDB 테이블 이름을 [논리적 테이블 이름](ddb-java-using.md#logical-table-name)으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB의 암호화 구성](ddb-java-using.md#ddb-config-encrypt) 단원을 참조하십시오.  
`FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT`을 일반 텍스트 오버라이드로 지정해야 합니다. 이 정책은 계속해서 일반 텍스트 항목을 읽고 쓰고, 암호화된 항목을 읽고, 클라이언트가 암호화된 항목을 쓸 수 있도록 준비시킵니다.  

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .plaintextOverride(PlaintextOverride.FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

**5. `DynamoDbEncryptionInterceptor` 생성**  
다음 예제는 **3단계**의 `tableConfigs`를 사용하여 `DynamoDbEncryptionInterceptor`을 생성합니다.  

```
DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder()
        .config(DynamoDbTablesEncryptionConfig.builder()
                .tableEncryptionConfigs(tableConfigs)                
                .build())
        .build();
```

## 2단계: 암호화되고 서명된 항목 쓰기
<a name="ddb-java-add-step2"></a>

`DynamoDbEncryptionInterceptor` 구성의 일반 텍스트 정책을 업데이트하여 클라이언트가 암호화되고 서명된 항목을 쓸 수 있도록 허용합니다. 다음 변경 사항을 배포하면 클라이언트는 **1단계**에서 구성한 속성 작업을 기반으로 새 항목을 암호화하고 서명합니다. 클라이언트는 일반 텍스트 항목과 암호화되고 서명된 항목을 읽을 수 있습니다.

[3단계](#ddb-java-add-step3)로 진행하기 전에 테이블의 기존 일반 텍스트 항목을 모두 암호화하고 서명해야 합니다. 기존 일반 텍스트 항목을 빠르게 암호화하기 위해 실행할 수 있는 단일 지표나 쿼리는 없습니다. 시스템에 가장 적합한 프로세스를 사용하세요. 예를 들어, 테이블을 천천히 스캔한 다음 정의한 속성 작업 및 암호화 구성을 사용하여 항목을 다시 쓰는 비동기 프로세스를 사용할 수 있습니다. 테이블의 일반 텍스트 항목을 식별하려면 암호화되고 서명될 때 AWS Database Encryption SDK가 항목에 추가하는 `aws_dbe_head` 및 `aws_dbe_foot` 속성이 포함되지 않은 모든 항목을 스캔하는 것이 좋습니다.

다음 예시에서는 **1단계**의 테이블 암호화 구성을 업데이트합니다. 일반 텍스트 오버라이드를 `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT`로 업데이트해야 합니다. 이 정책은 일반 텍스트 항목을 계속 읽지만 암호화된 항목을 읽고 쓸 수도 있습니다. 업데이트된를 `DynamoDbEncryptionInterceptor` 사용하여 새를 생성합니다`tableConfigs`.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

## 3단계: 암호화되고 서명된 항목만 읽기
<a name="ddb-java-add-step3"></a>

모든 항목을 암호화하고 서명한 후에는 `DynamoDbEncryptionInterceptor` 구성의 일반 텍스트 재정의를 업데이트하여 클라이언트가 암호화되고 서명된 항목만 읽고 쓸 수 있도록 합니다. 다음 변경 사항을 배포하면 클라이언트는 **1단계**에서 구성한 속성 작업을 기반으로 새 항목을 암호화하고 서명합니다. 클라이언트는 암호화되고 서명된 항목만 읽을 수 있습니다.

다음 예시에서는 **2단계**의 테이블 암호화 구성을 업데이트합니다. `FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT`으로 일반 텍스트 재정의를 업데이트하거나 구성에서 일반 텍스트 정책을 제거할 수 있습니다. 클라이언트는 기본적으로 암호화되고 서명된 항목만 읽고 씁니다. 업데이트된를 `DynamoDbEncryptionInterceptor` 사용하여 새를 생성합니다`tableConfigs`.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        // Optional: you can also remove the plaintext policy from your configuration
        .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

# DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.x로 마이그레이션
<a name="ddb-java-migrate"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*는 2.*x* 코드 베이스를 대대적으로 재작성한 것입니다. 여기에는 새로운 구조화된 데이터 형식, 향상된 멀티테넌시 지원, 원활한 스키마 변경, 검색 가능한 암호화 지원 등 많은 업데이트가 포함되어 있습니다. 이 항목에서는 코드를 버전 3.*x*으로 마이그레이션하는 방법에 대한 지침을 제공합니다.

## 버전 1.x에서 2.x로 마이그레이션
<a name="ddb-java-v1-to-v2"></a>

버전 3.*x*로 마이그레이션하기 전에 버전 2.*x*로 마이그레이션합니다. 버전 2.*x*에서는 Most Recent Provider의 기호가 `MostRecentProvider`에서 `CachingMostRecentProvider`로 변경되었습니다. 현재 `MostRecentProvider` 기호와 함께 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 1.*x* 를 사용하는 경우 코드의 기호 이름을 `CachingMostRecentProvider`으로 업데이트해야 합니다. 자세한 내용은 [Most Recent Provider 업데이트](most-recent-provider.md#mrp-versions)를 참조하세요.

## 버전 2.x에서 3.x로 마이그레이션
<a name="ddb-java-v2-to-v3"></a>

다음 절차에서는 코드를 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 2.*x*에서 버전 3.*x*로 마이그레이션하는 방법을 설명합니다.

### 1단계. 새 형식의 항목을 읽을 준비하기
<a name="ddb-java-migrate-step1"></a>

다음 단계를 완료하여 AWS Database Encryption SDK 클라이언트가 새 형식으로 항목을 읽을 수 있도록 준비합니다. 다음 변경 사항을 배포한 후에도 클라이언트는 버전 2.*x*에서와 동일한 방식으로 계속 동작합니다. 클라이언트는 계속해서 버전 2.*x* 형식의 항목을 읽고 쓰지만 이러한 변경 사항을 통해 클라이언트는 [새 형식의 항목을 읽을 수 있도록](#ddb-java-migrate-step2) 준비합니다.

**를 버전 2.x AWS SDK for Java 로 업데이트**  
DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.*x*에는 [DynamoDB Enhanced Client](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html)가 필요합니다. DynamoDB Enhanced Client는 이전 버전에서 사용된 [DynamoDBMapper](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html)를 대체합니다. 향상된 클라이언트를 사용하려면 AWS SDK for Java 2.x를 사용해야 합니다.  
[AWS SDK for Java의 버전 1.x에서 2.x로 마이그레이션하기](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html) 지침을 따르세요.  
필요한 AWS SDK for Java 2.x 모듈에 대한 자세한 내용은 섹션을 참조하세요[사전 조건](ddb-java.md#ddb-java-prerequisites).

**레거시 버전으로 암호화된 항목을 읽도록 클라이언트 구성**  
다음 절차는 아래 코드 예제에 나와 있는 단계의 개요를 제공합니다.  

1. [키링](keyrings.md)을 생성합니다.

   키링 및 [암호화 자료 관리자](concepts.md#crypt-materials-manager)는 이전 버전의 DynamoDB용 Java 클라이언트측 암호화 라이브러리에서 사용하던 암호화 자료 공급자를 대체합니다.
**중요**  
키링을 생성할 때 지정하는 래핑 키는 버전 2.*x*에서 암호화 자료 공급자에 사용한 래핑 키와 동일해야 합니다.

1. 주석이 달린 클래스 위에 테이블 스키마를 만듭니다.

   이 단계에서는 새 형식으로 항목을 작성하기 시작할 때 사용할 속성 작업을 정의합니다.

   새로운 DynamoDB Enhanced Client 사용에 대한 지침은 *AWS SDK for Java 개발자 안내서*의 [`TableSchema` 생성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html)을 참조하세요.

   다음 예제에서는 새 속성 작업 주석을 사용하여 버전 2.*x*에서 주석이 달린 클래스를 업데이트했다고 가정합니다. 속성 작업에 주석을 다는 방법에 대한 자세한 지침은 [주석이 달린 데이터 클래스 사용](ddb-java-using.md#ddb-attribute-actions-annotated-data-class)을 참조하세요.
**참고**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 속성을 지정하는 경우 파티션 및 정렬 속성도 여야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. 를 정의하는 데 사용되는 주석을 보여주는 예제는 [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java)를 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`참조하세요.

1. [서명에서 제외할 속성](ddb-java-using.md#allowed-unauth)을 정의합니다.

1. 버전 2.x 모델 클래스에 구성된 속성 작업의 명시적 맵을 구성합니다.

   이 단계에서는 이전 형식으로 항목을 작성하는 데 사용되는 속성 작업을 정의합니다.

1. DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 2.*x*에서 사용한 `DynamoDBEncryptor`을 구성합니다.

1. 레거시 동작을 구성합니다.

1. `DynamoDbEncryptionInterceptor`를 만듭니다.

1. 새 AWS SDK DynamoDB 클라이언트를 생성합니다.

1. `DynamoDBEnhancedClient`를 만들고 모델링된 클래스로 테이블을 생성합니다.

   DynamoDB Enhanced Client에 대한 자세한 내용은 [향상된 클라이언트 생성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient)을 참조하세요.

```
public class MigrationExampleStep1 {

    public static void MigrationStep1(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Create a Keyring.
        //    This example creates an AWS KMS Keyring that specifies the 
        //    same kmsKeyId previously used in the version 2.x configuration.
        //    It uses the 'CreateMrkMultiKeyring' method to create the 
        //    keyring, so that the keyring can correctly handle both single
        //    region and Multi-Region KMS Keys.
        //    Note that this example uses the AWS SDK for Java v2 KMS client.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        // 2. Create a Table Schema over your annotated class.
        //    For guidance on using the new attribute actions 
        //    annotations, see SimpleClass.java in the 
        //    aws-database-encryption-sdk-dynamodb GitHub repository. 
        //    All primary key attributes must be signed but not encrypted 
        //    and by default all non-primary key attributes 
        //    are encrypted and signed (ENCRYPT_AND_SIGN).
        //    If you want a particular non-primary key attribute to be signed but
        //    not encrypted, use the 'DynamoDbEncryptionSignOnly' annotation.
        //    If you want a particular attribute to be neither signed nor encrypted
        //    (DO_NOTHING), use the 'DynamoDbEncryptionDoNothing' annotation.
        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        // 3. Define which attributes the client should expect to be excluded 
        //    from the signature when reading items.
        //    This value represents all unsigned attributes across the entire 
        //    dataset.
        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");

        // 4. Configure an explicit map of the attribute actions configured 
        //    in your version 2.x modeled class.
        final Map<String, CryptoAction> legacyActions = new HashMap<>();
        legacyActions.put("partition_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("sort_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
        legacyActions.put("attribute2", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute3", CryptoAction.DO_NOTHING);

        // 5. Configure the DynamoDBEncryptor that you used in version 2.x.
        final AWSKMS kmsClient = AWSKMSClientBuilder.defaultClient();
        final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, kmsKeyId);
        final DynamoDBEncryptor oldEncryptor = DynamoDBEncryptor.getInstance(cmp);

        // 6. Configure the legacy behavior.
        //    Input the DynamoDBEncryptor and attribute actions created in 
        //    the previous steps. For Legacy Policy, use 
        //    'FORCE_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT'. This policy continues to read 
        //    and write items using the old format, but will be able to read
        //    items written in the new format as soon as they appear.
        final LegacyOverride legacyOverride = LegacyOverride
                .builder()
                .encryptor(oldEncryptor)
                .policy(LegacyPolicy.FORCE_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT)
                .attributeActionsOnEncrypt(legacyActions)
                .build();

        // 7. Create a DynamoDbEncryptionInterceptor with the above configuration.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .legacyOverride(legacyOverride)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 8. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 7.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 9. Create the DynamoDbEnhancedClient using the AWS SDK DynamoDb client 
        //    created in Step 8, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```

### 2단계. 새 형식으로 항목 작성
<a name="ddb-java-migrate-step2"></a>

1단계의 변경 사항을 모든 리더에 배포한 후 다음 단계를 완료하여 새 형식으로 항목을 작성하도록 AWS Database Encryption SDK 클라이언트를 구성합니다. 다음 변경 사항을 배포한 후 클라이언트는 이전 형식의 항목을 계속 읽고 새 형식의 항목을 쓰고 읽기 시작합니다.

다음 절차는 아래 코드 예제에 나와 있는 단계의 개요를 제공합니다.

1. [**1단계**](#ddb-java-migrate-step1)에서 했던 것처럼 키링, 테이블 스키마, 레거시 속성 작업, `allowedUnsignedAttributes` 및 `DynamoDBEncryptor`를 계속 구성합니다.

1. 새 형식을 사용하여 새 항목만 작성하도록 레거시 동작을 업데이트합니다.

1. `DynamoDbEncryptionInterceptor ` 생성

1. 새 AWS SDK DynamoDB 클라이언트를 생성합니다.

1. `DynamoDBEnhancedClient`를 만들고 모델링된 클래스로 테이블을 생성합니다.

   DynamoDB Enhanced Client에 대한 자세한 내용은 [향상된 클라이언트 생성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient)을 참조하세요.

```
public class MigrationExampleStep2 {

    public static void MigrationStep2(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Continue to configure your keyring, table schema, legacy 
        //    attribute actions, allowedUnsignedAttributes, and 
        //    DynamoDBEncryptor as you did in Step 1.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");

        final Map<String, CryptoAction> legacyActions = new HashMap<>();
        legacyActions.put("partition_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("sort_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
        legacyActions.put("attribute2", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute3", CryptoAction.DO_NOTHING);

        final AWSKMS kmsClient = AWSKMSClientBuilder.defaultClient();
        final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, kmsKeyId);
        final DynamoDBEncryptor oldEncryptor = DynamoDBEncryptor.getInstance(cmp);

        // 2. Update your legacy behavior to only write new items using the new
        //    format. 
        //    For Legacy Policy, use 'FORBID_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT'. This policy
        //    continues to read items in both formats, but will only write items
        //    using the new format.
        final LegacyOverride legacyOverride = LegacyOverride
                .builder()
                .encryptor(oldEncryptor)
                .policy(LegacyPolicy.FORBID_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT)
                .attributeActionsOnEncrypt(legacyActions)
                .build();

        // 3. Create a DynamoDbEncryptionInterceptor with the above configuration.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .legacyOverride(legacyOverride)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 4. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 3.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 5. Create the DynamoDbEnhancedClient using the AWS SDK DynamoDb Client created
        //    in Step 4, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```

2단계 변경 사항을 배포한 후에는 테이블의 모든 이전 항목을 새 형식으로 다시 암호화해야 [3단계](#ddb-java-migrate-step3)로 넘어갈 수 있습니다. 기존 항목을 빠르게 암호화하기 위해 실행할 수 있는 단일 지표나 쿼리는 없습니다. 시스템에 가장 적합한 프로세스를 사용하세요. 예를 들어, 테이블을 천천히 스캔한 다음 정의한 새 속성 작업 및 암호화 구성을 사용하여 항목을 다시 쓰는 비동기 프로세스를 사용할 수 있습니다.

### 3단계. 새 형식의 항목만 읽고 쓸 수 있습니다
<a name="ddb-java-migrate-step3"></a>

테이블의 모든 항목을 새 형식으로 다시 암호화한 후 구성에서 기존 동작을 제거할 수 있습니다. 클라이언트가 새 형식의 항목만 읽고 쓰도록 구성하려면 다음 단계를 수행합니다.

다음 절차는 아래 코드 예제에 나와 있는 단계의 개요를 제공합니다.

1. [**1단계에서**](#ddb-java-migrate-step1) 수행한 것처럼 키링, 테이블 스키마, `allowedUnsignedAttributes`을 계속 구성합니다. 구성에서 레거시 속성 작업 및 `DynamoDBEncryptor`을 제거합니다.

1. `DynamoDbEncryptionInterceptor`를 만듭니다.

1. 새 AWS SDK DynamoDB 클라이언트를 생성합니다.

1. `DynamoDBEnhancedClient`를 만들고 모델링된 클래스로 테이블을 생성합니다.

   DynamoDB Enhanced Client에 대한 자세한 내용은 [향상된 클라이언트 생성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient)을 참조하세요.

```
public class MigrationExampleStep3 {

    public static void MigrationStep3(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Continue to configure your keyring, table schema,
        //    and allowedUnsignedAttributes as you did in Step 1.
        //    Do not include the configurations for the DynamoDBEncryptor or 
        //    the legacy attribute actions.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");


        // 3. Create a DynamoDbEncryptionInterceptor with the above configuration.
        //    Do not configure any legacy behavior.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 4. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 3.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 5. Create the DynamoDbEnhancedClient using the AWS SDK Client 
        //    created in Step 4, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```