

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# DynamoDB マッパーを設定する
<a name="ddb-mapper-configuration"></a>

****  
**DynamoDB Mapper はデベロッパープレビューリリースです。機能は完了しておらず、変更される可能性があります。**

DynamoDB Mapper には、アプリケーションに合わせてライブラリの動作をカスタマイズできる設定オプションが用意されています。

## インターセプターを使用する
<a name="ddb-mapper-interceptors"></a>

DynamoDB マッパーライブラリは、マッパーのリクエストパイプラインの重要な段階で利用できるフックを定義します。`[Interceptor](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper.pipeline/-interceptor/index.html)` インターフェイスを実装して、マッパープロセスを監視または変更するフックを実装できます。

1 つの DynamoDB Mapper に 1 つ以上のインターセプターを設定オプションとして登録できます。インターセプターを登録する方法については、このセクションの最後にある[例](#ddb-mapper-interceptors-hooks-example-conf)を参照してください。

### リクエストパイプラインを理解する
<a name="ddb-mapper-interceptors-pipeline"></a>

マッパーのリクエストパイプラインは、次の 5 つのステップで構成されます。

1. **初期化:** オペレーションを設定し、初期コンテキストを収集します。

1. **シリアル化:** 高レベルのリクエストオブジェクトを低レベルのリクエストオブジェクトに変換します。このステップでは、高レベルの Kotlin オブジェクトを、属性名と値で構成される DynamoDB 項目に変換します。

1. **低レベル呼び出し:** 基盤となる DynamoDB クライアントでリクエストを実行します。

1. **逆シリアル化:** 低レベルのレスポンスオブジェクトを高レベルのレスポンスオブジェクトに変換します。このステップでは、属性名と値で構成される DynamoDB 項目を高レベルの Kotlin オブジェクトに変換します。

1. **完了:** 発信者に返す高レベルのレスポンスを確定します。パイプラインの実行中に例外がスローされた場合、このステップは呼び出し元にスローされる例外を確定します。

### フック
<a name="ddb-mapper-interceptors-hooks"></a>

フックは、マッパーがパイプラインの特定のステップの前後に呼び出すインターセプターメソッドです。フックには、*読み取り専用*と*変更* (または読み取り/書き込み) の 2 つのバリアントがあります。たとえば、 `readBeforeInvocation`は、低レベルの呼び出しステップの前に フェーズでマッパーが実行する読み取り専用フックです。

#### 読み取り専用フック
<a name="ddb-mapper-interceptors-hooks-ro"></a>

マッパーは、パイプラインの各ステップの前後に読み取り専用フックを呼び出します (*初期化*ステップの前と*完了*ステップの後を除く）。読み取り専用のフードは、進行中の高レベルのオペレーションの読み取り専用ビューを提供します。ログ記録、デバッグ、メトリクスの収集などのオペレーションの状態を調べるメカニズムを提供します。各読み取り専用フックはコンテキスト引数を受け取り、 を返します`[Unit](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/)`。

マッパーは、読み取り専用フック中にスローされた例外をキャッチし、コンテキストに追加します。次に、同じフェーズの後続のインターセプターフックに例外でコンテキストを渡します。マッパーは、同じフェーズで最後のインターセプターの読み取り専用フックを呼び出した後にのみ、呼び出し元に例外をスローします。たとえば、マッパーが 2 つのインターセプター `A` と で構成され`B`ていて、 `A`の`readAfterSerialization`フックが例外をスローする場合、マッパーは `B`の`readAfterSerialization`フックに渡されたコンテキストに例外を追加します。`B`の`readAfterSerialization`フックが完了すると、マッパーは例外を呼び出し元にスローします。

#### フックの変更
<a name="ddb-mapper-interceptors-hooks-modify"></a>

マッパーは、パイプラインの各ステップの前に変更フックを呼び出します (*初期化*前を除く）。変更フックは、進行中の高レベルのオペレーションを表示および変更する機能を提供します。マッパー設定や項目スキーマではカスタマイズできない方法で動作やデータをカスタマイズするために使用できます。各変更フックはコンテキスト引数を受け取り、結果としてそのコンテキストの一部のサブセットを返します。これは、フックによって変更されるか、入力コンテキストから渡されます。

変更フックの実行中にマッパーが例外をキャッチした場合、同じフェーズで他のインターセプターの変更フックは実行されません。マッパーは例外をコンテキストに追加し、次の読み取り専用フックに渡します。マッパーは、同じフェーズで最後のインターセプターの読み取り専用フックを呼び出した後にのみ、呼び出し元に例外をスローします。たとえば、マッパーが 2 つのインターセプター `A` と で構成され`B`ていて、 `A`の`modifyBeforeSerialization`フックが例外をスローした場合、 `B`の`modifyBeforeSerialization`フックは呼び出されません。インターセプタ`A`ーの および `B'``readAfterSerialization`フックが実行され、その後例外が呼び出し元にスローバックされます。

#### 実行順序
<a name="ddb-mapper-interceptors-hooks-ex-order"></a>

マッパーの設定でインターセプターが定義される順序によって、マッパーがフックを呼び出す順序が決まります。
+ *低レベル呼び出し*ステップより*前の*フェーズでは、設定で追加されたの*と同じ順序*でフックを実行します。
+ * 低レベル呼び出し*ステップの*後の*フェーズでは、設定に追加された順序とは*逆の順序*でフックを実行します。

次の図は、フックメソッドの実行順序を示しています。

![\[インターセプターフックメソッドのフローチャート。\]](http://docs.aws.amazon.com/ja_jp/sdk-for-kotlin/latest/developer-guide/images/KotlinDevGuide-dynamodbMapper-hook-flowchart.png)


##### フックメソッドの実行順序のテキスト説明
<a name="ixg_ypr_ddc"></a>

マッパーはインターセプタのフックを次の順序で実行します。

1. DynamoDB Mapper が高レベルのリクエストを呼び出す

1. 実行前に読み取る

1. シリアル化前に変更する

1. シリアル化前に読み取る

1. DynamoDB Mapper はオブジェクトを項目に変換します

1. シリアル化後の読み取り

1. 呼び出し前に変更する

1. 呼び出し前に読み取る

1. DynamoDB Mapper が低レベルオペレーションを呼び出します

1. 呼び出し後の読み取り

1. 逆シリアル化前に変更する

1. 逆シリアル化前に読み取る

1. DynamoDB Mapper が項目をオブジェクトに変換する

1. 逆シリアル化後の読み取り

1. 完了前に変更する

1. 実行後の読み取り

1. DynamoDB Mapper が高レベルのレスポンスを返す

#### 設定例
<a name="ddb-mapper-interceptors-hooks-example-conf"></a>

次の例は、`DynamoDbMapper`インスタンスでインターセプターを設定する方法を示しています。

```
import aws.sdk.kotlin.hll.dynamodbmapper.DynamoDbMapper
import aws.sdk.kotlin.hll.dynamodbmapper.operations.ScanRequest
import aws.sdk.kotlin.hll.dynamodbmapper.operations.ScanResponse
import aws.sdk.kotlin.hll.dynamodbmapper.pipeline.Interceptor
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
import aws.sdk.kotlin.services.dynamodb.model.ScanRequest as LowLevelScanRequest
import aws.sdk.kotlin.services.dynamodb.model.ScanResponse as LowLevelScanResponse

val printingInterceptor = object : Interceptor<User, ScanRequest<User>, LowLevelScanRequest, LowLevelScanResponse, ScanResponse<User>> {
    override fun readBeforeDeserialization(ctx: LResContext<User, ScanRequest<User>, LowLevelScanRequest, LowLevelScanResponse>) {
        println("Scan response contains ${ctx.lowLevelResponse.count} items.")
    }
}

val client = DynamoDbClient.fromEnvironment()

val mapper = DynamoDbMapper(client) {
    interceptors += printingInterceptor
}
```