

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

# DynamoDB Encryption Client for Java의 예제 코드
<a name="java-examples"></a>

**참고**  
클라이언트측 암호화 라이브러리의 [이름이 AWS Database Encryption SDK로 변경되었습니다](DDBEC-rename.md). 다음 주제에서는 Java용 DynamoDB Encryption Client 버전 1.*x*\$12.*x* 와 Python용 DynamoDB Encryption Client 버전 1.*x*\$13.*x*에 대한 정보를 제공합니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB 버전 지원](legacy-dynamodb-encryption-client.md#legacy-support)을 참조하세요.

다음 예제에서는 DynamoDB Encryption Client for Java를 사용하여 애플리케이션에서 DynamoDB 테이블 항목을 보호하는 방법을 보여줍니다. GitHub의 [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/) 리포지토리의 [예제](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) 디렉터리에서 더 많은 예제를 찾고 직접 제공할 수 있습니다.

**Topics**
+ [DynamoDBEncryptor 사용](#java-example-ddb-encryptor)
+ [DynamoDBMapper 사용](#java-example-dynamodb-mapper)

## DynamoDBEncryptor 사용
<a name="java-example-ddb-encryptor"></a>

이 예제에서는 [Direct KMS Provider](direct-kms-provider.md)와 함께 하위 수준 [DynamoDBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html)를 사용하는 방법을 보여줍니다. 다이렉트 KMS 공급자는 사용자가 지정한 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) in AWS Key Management Service (AWS KMS)에서 암호화 자료를 생성하고 보호합니다.

`DynamoDBEncryptor`와 함께 호환 가능한 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)를 사용할 수 있고 `DynamoDBMapper` 및 [AttributeEncryptor](java-using.md#attribute-encryptor)에서는 Direct KMS Provider를 사용할 수 있습니다.

**전체 코드 샘플 보기**: [AwsKmsEncryptedItem.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)

1단계: Direct KMS Provider 생성  
지정된 리전으로 AWS KMS 클라이언트의 인스턴스를 생성합니다. 그런 다음 클라이언트 인스턴스를 사용하여 원하는 AWS KMS key로 Direct KMS Provider의 인스턴스를 생성합니다.  
이 예제에서는 Amazon 리소스 이름(ARN)을 사용하여를 식별 AWS KMS key하지만 [유효한 키 식별자를](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn) 사용할 수 있습니다.  

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

2단계: 항목 생성  
이 예제는 샘플 테이블 항목을 나타내는 `record` HashMap을 정의합니다.  

```
final String partitionKeyName = "partition_attribute";
final String sortKeyName = "sort_attribute";

final Map<String, AttributeValue> record = new HashMap<>();
record.put(partitionKeyName, new AttributeValue().withS("value1"));
record.put(sortKeyName, new AttributeValue().withN("55"));
record.put("example", new AttributeValue().withS("data"));
record.put("numbers", new AttributeValue().withN("99"));
record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02})));
record.put("test", new AttributeValue().withS("test-value"));
```

3단계: DynamoDBEncryptor 생성  
Direct KMS Provider를 사용하여 `DynamoDBEncryptor` 인스턴스를 생성합니다.  

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
```

4단계: DynamoDB 암호화 컨텍스트 생성  
[DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)에는 테이블 구조와 암호화 및 서명 방법에 대한 정보가 포함되어 있습니다. `DynamoDBMapper`를 사용하는 경우 `AttributeEncryptor`에서 자동으로 암호화 컨텍스트를 생성합니다.  

```
final String tableName = "testTable";

final EncryptionContext encryptionContext = new EncryptionContext.Builder()
    .withTableName(tableName)
    .withHashKeyName(partitionKeyName)
    .withRangeKeyName(sortKeyName)
    .build();
```

5단계: 속성 작업 객체 생성  
[속성 작업](DDBEC-legacy-concepts.md#legacy-attribute-actions)은 암호화 및 서명되는 항목 속성, 서명되기만 하는 속성, 암호화 및 서명되지 않는 속성을 결정합니다.  
Java에서 속성 작업을 지정하려면 속성 이름 및 `EncryptionFlags` 값 페어로 구성된 HashMap을 생성합니다.  
예를 들어, 다음 Java 코드는 서명되었지만 암호화되지 않은 파티션 키 및 정렬 키 속성과 서명되거나 암호화되지 않은 `test` 속성을 제외한 `record` 항목의 모든 속성을 암호화하고 서명하는 `actions` HashMap을 생성합니다.  

```
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN);
final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN);
final Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

for (final String attributeName : record.keySet()) {
  switch (attributeName) {
    case partitionKeyName: // fall through to the next case
    case sortKeyName:
      // Partition and sort keys must not be encrypted, but should be signed
      actions.put(attributeName, signOnly);
      break;
    case "test":
      // Neither encrypted nor signed
      break;
    default:
      // Encrypt and sign all other attributes
      actions.put(attributeName, encryptAndSign);
      break;
  }
}
```

6단계: 항목 암호화 및 서명  
테이블 항목을 암호화하고 서명하려면 `DynamoDBEncryptor`의 인스턴스에서 `encryptRecord` 방법을 호출합니다. 테이블 항목(`record`), 속성 작업(`actions`) 및 암호화 컨텍스트(`encryptionContext`)를 지정합니다.  

```
final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
```

7단계: DynamoDB 테이블에 항목 넣기  
마지막으로 암호화되고 서명된 항목을 DynamoDB 테이블에 넣습니다.  

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();
ddb.putItem(tableName, encrypted_record);
```

## DynamoDBMapper 사용
<a name="java-example-dynamodb-mapper"></a>

다음 예에서는 [Direct KMS Provider](direct-kms-provider.md)와 함께 DynamoDB 매퍼 도우미 클래스를 사용하는 방법을 보여줍니다. Direct KMS Provider는 사용자가 지정한 AWS Key Management Service (AWS KMS)의 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)로 암호화 자료를 생성 및 보호합니다.

`DynamoDBMapper`와 함께 호환 가능한 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)를 사용할 수 있으며, 하위 수준 `DynamoDBEncryptor`오 함께 Direct KMS Provider를 사용할 수 있습니다.

**전체 코드 샘플 보기**: [AwsKmsEncryptedObject.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java)

1단계: Direct KMS Provider 생성  
지정된 리전으로 AWS KMS 클라이언트의 인스턴스를 생성합니다. 그런 다음 클라이언트 인스턴스를 사용하여 원하는 AWS KMS key로 Direct KMS Provider의 인스턴스를 생성합니다.  
이 예제에서는 Amazon 리소스 이름(ARN)을 사용하여를 식별 AWS KMS key하지만 [유효한 키 식별자를](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) 사용할 수 있습니다.  

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

2단계: DynamoDB Encryptor 및 DynamoDBMapper 만들기  
이전 단계에서 생성한 Direct KMS Provider를 사용하여 [DynamoDB Encryptor](java-using.md#attribute-encryptor)의 인스턴스를 생성합니다. DynamoDB Mapper를 사용하려면 하위 수준의 DynamoDB Encryptor를 인스턴스화해야 합니다.  
그런 다음 DynamoDB 데이터베이스 인스턴스와 매퍼 구성을 만들고 이를 사용하여 DynamoDB Mapper의 인스턴스를 만듭니다.  
`DynamoDBMapper`를 사용하여 서명된(또는 암호화 및 서명된) 항목을 추가하거나 편집하는 경우 다음 예와 같이 모든 속성을 포함하는 `PUT`와 같은 [저장 동작을 사용](java-using.md#save-behavior)하도록 구성합니다. 그렇지 않으면 데이터를 복호화하지 못할 수 있습니다.

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp)
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build();
DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
```

3단계: DynamoDB 테이블 정의  
다음으로 DynamoDB 테이블을 정의합니다. 주석을 사용하여 [속성 작업](java-using.md#attribute-actions-java)을 지정합니다. 이 예제에서는 DynamoDB 테이블, `ExampleTable` 및 테이블 항목을 나타내는 `DataPoJo` 클래스를 만듭니다.  
이 샘플 테이블에서는 기본 키 속성이 서명되지만 암호화되지는 않습니다. 이는 `@DynamoDBHashKey` 주석이 달린 `partition_attribute` 및 `@DynamoDBRangeKey` 주석이 달린 `sort_attribute`에 적용됩니다.  
`@DynamoDBAttribute` 주석이 달린 속성(예: `some numbers`)은 암호화 및 서명됩니다. DynamoDB Encryption Client에서 정의한 `@DoNotEncrypt`(기호만 해당) 또는 `@DoNotTouch`(암호화 또는 서명 안 함) 암호화 주석을 사용하는 속성은 예외입니다. 예를 들어 `leave me` 속성에 `@DoNotTouch` 주석이 있으므로 암호화되거나 서명되지 않습니다.  

```
@DynamoDBTable(tableName = "ExampleTable")
public static final class DataPoJo {
  private String partitionAttribute;
  private int sortAttribute;
  private String example;
  private long someNumbers;
  private byte[] someBinary;
  private String leaveMe;

  @DynamoDBHashKey(attributeName = "partition_attribute")
  public String getPartitionAttribute() {
    return partitionAttribute;
  }

  public void setPartitionAttribute(String partitionAttribute) {
    this.partitionAttribute = partitionAttribute;
  }

  @DynamoDBRangeKey(attributeName = "sort_attribute")
  public int getSortAttribute() {
    return sortAttribute;
  }

  public void setSortAttribute(int sortAttribute) {
    this.sortAttribute = sortAttribute;
  }

  @DynamoDBAttribute(attributeName = "example")
  public String getExample() {
    return example;
  }

  public void setExample(String example) {
    this.example = example;
  }

  @DynamoDBAttribute(attributeName = "some numbers")
  public long getSomeNumbers() {
    return someNumbers;
  }

  public void setSomeNumbers(long someNumbers) {
    this.someNumbers = someNumbers;
  }

  @DynamoDBAttribute(attributeName = "and some binary")
  public byte[] getSomeBinary() {
    return someBinary;
  }

  public void setSomeBinary(byte[] someBinary) {
    this.someBinary = someBinary;
  }

  @DynamoDBAttribute(attributeName = "leave me")
  @DoNotTouch
  public String getLeaveMe() {
    return leaveMe;
  }

  public void setLeaveMe(String leaveMe) {
    this.leaveMe = leaveMe;
  }

  @Override
  public String toString() {
    return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute="
        + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers
        + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]";
  }
}
```

4단계: 테이블 항목 암호화 및 저장  
이제 테이블 항목을 만들고 DynamoDB Mapper를 사용하여 저장하면 항목이 테이블에 추가되기 전에 자동으로 암호화되고 서명됩니다.  
이 예제에서는 `record`라는 테이블 항목을 정의합니다. 테이블에 저장되기 전에 해당 속성은 `DataPoJo` 클래스의 주석을 기반으로 암호화되고 서명됩니다. 이 경우 `PartitionAttribute`, `SortAttribute` 및 `LeaveMe`를 제외한 모든 속성은 암호화되고 서명됩니다. `PartitionAttribute` 및 `SortAttributes`는 서명만 됩니다. `LeaveMe` 속성은 암호화되거나 서명되지 않습니다.  
`record` 항목을 암호화하고 서명한 다음 `ExampleTable`에 추가하려면 `DynamoDBMapper` 클래스의 `save` 메서드를 호출합니다. DynamoDB Mapper는 `PUT` 저장 동작을 사용하도록 구성되어 있으므로 항목을 업데이트하는 대신에 동일한 프라이머리 키로 항목을 대체합니다. 이렇게 하면 서명이 일치하고 테이블에서 항목을 가져올 때 해당 항목의 암호를 복호화할 수 있습니다.  

```
DataPoJo record = new DataPoJo();
record.setPartitionAttribute("is this");
record.setSortAttribute(55);
record.setExample("data");
record.setSomeNumbers(99);
record.setSomeBinary(new byte[]{0x00, 0x01, 0x02});
record.setLeaveMe("alone");

mapper.save(record);
```