1. 概要

この記事では、実践的な実践的なサンプルプロジェクトを使用して、DynamoDBをSpring BootApplicationに統合するための基本を探ります。

SpringDataを使用してローカルDynamoDBインスタンスを使用するようにアプリケーションを設定する方法を示します。 また、サンプルのデータモデルとリポジトリクラスを作成し、統合テストを使用して実際のデータベース操作を実行します。

2. DynamoDB

DynamoDBは、CassandraやMongoDBなどの他のNoSQLデータベースと同様に、AWSで完全に管理されたホスト型NoSQLデータベースです。 DynamoDBは、高速で一貫性のある予測可能なパフォーマンスを提供し、非常にスケーラブルです。

DynamoDBの詳細については、AWSドキュメントをご覧ください。

ライブインスタンスの実行コストが発生しないように、DynamoDBのローカルインスタンスをインストールしましょう。

開発の場合、DynamoDBをローカルで実行する方がAWSで実行するよりも理にかなっています。 ローカルインスタンスは実行可能なJARファイルとして実行されます。

DynamoDBをローカルで実行する方法の説明はここにあります。

3. Mavenの依存関係

次の依存関係を追加して、SpringDataを使用したDynamoDBの操作を開始します。

<dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-releasetrain</artifactId>
        <version>Lovelace-SR16</version>
        <type>pom</type>
        <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-dynamodb</artifactId>
        <version>1.11.64</version>
    </dependency>
    <dependency>
        <groupId>com.github.derjust</groupId>
        <artifactId>spring-data-dynamodb</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>

上記の最新バージョンについては、 Spring Data Release Train AWS Java SDK For Amazon DynamoDB 、および Spring DataDynamoDBを確認してください。

4. 構成

次に、application.propertiesファイルで次のプロパティを定義しましょう。

amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=key
amazon.aws.secretkey=key2

上記のアクセスキーとシークレットキーは、ローカル構成の任意の値です。 DynamoDBのローカルインスタンスにアクセスする場合、これらのフィールドにはいくつかの値を入力する必要がありますが、実際に認証する必要はありません。

プロパティは、 Springconfigapplication.propertiesファイルから動的に取得されます。

@Configuration
@EnableDynamoDBRepositories
  (basePackages = "com.baeldung.spring.data.dynamodb.repositories")
public class DynamoDBConfig {

    @Value("${amazon.dynamodb.endpoint}")
    private String amazonDynamoDBEndpoint;

    @Value("${amazon.aws.accesskey}")
    private String amazonAWSAccessKey;

    @Value("${amazon.aws.secretkey}")
    private String amazonAWSSecretKey;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        AmazonDynamoDB amazonDynamoDB 
          = new AmazonDynamoDBClient(amazonAWSCredentials());
        
        if (!StringUtils.isEmpty(amazonDynamoDBEndpoint)) {
            amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint);
        }
        
        return amazonDynamoDB;
    }

    @Bean
    public AWSCredentials amazonAWSCredentials() {
        return new BasicAWSCredentials(
          amazonAWSAccessKey, amazonAWSSecretKey);
    }
}

5. データモデル

次に、DynamoDBに保存されているデータを表すPOJOモデルを作成しましょう。

このPOJOは、Hibernateで使用されるものと同様の注釈を使用して、テーブル名、属性、キー、およびテーブルの他の側面を定義します。

5.1. データモデルの属性

次のクラスProductInfoは、3つの属性を含むアイテムを含むテーブルを表します。

  1. ID
  2. 希望小売価格
  3. 料金

5.2. Javaデータモデルクラス

データモデルフォルダにProductInfo。javaというファイルを作成しましょう。

@DynamoDBTable(tableName = "ProductInfo")
public class ProductInfo {
    private String id;
    private String msrp;
    private String cost;

    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    public String getId() {
        return id;
    }

    @DynamoDBAttribute
    public String getMsrp() {
        return msrp;
    }

    @DynamoDBAttribute
    public String getCost() {
        return cost;
    }

    // standard setters/constructors
}

6. CRUDリポジトリ

次に、 ProductRepository インターフェイスを作成して、構築するCRUD機能を定義する必要があります。 DynamoDBとの間でデータの読み取りと永続化に使用されるリポジトリは、次のインターフェイスを実装します。

@EnableScan
public interface ProductInfoRepository extends 
  CrudRepository<ProductInfo, String> {
    
    Optional<ProductInfo> findById(String id);
}

7. 統合テスト

次に、統合テストを作成して、DynamoDBのローカルインスタンスに正常に接続できることを確認しましょう。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
@ActiveProfiles("local")
@TestPropertySource(properties = { 
  "amazon.dynamodb.endpoint=http://localhost:8000/", 
  "amazon.aws.accesskey=test1", 
  "amazon.aws.secretkey=test231" })
public class ProductInfoRepositoryIntegrationTest {

    private DynamoDBMapper dynamoDBMapper;

    @Autowired
    private AmazonDynamoDB amazonDynamoDB;

    @Autowired
    ProductInfoRepository repository;

    private static final String EXPECTED_COST = "20";
    private static final String EXPECTED_PRICE = "50";

    @Before
    public void setup() throws Exception {
        dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);
        
        CreateTableRequest tableRequest = dynamoDBMapper
          .generateCreateTableRequest(ProductInfo.class);
        tableRequest.setProvisionedThroughput(
          new ProvisionedThroughput(1L, 1L));
        amazonDynamoDB.createTable(tableRequest);
        
        //...

        dynamoDBMapper.batchDelete(
          (List<ProductInfo>)repository.findAll());
    }

    @Test
    public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { 
        ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
        repository.save(productInfo); 
        List<ProductInfo> result = (List<ProductInfo>) repository.findAll();

        assertThat(result.size(), is(greaterThan(0)));
        assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); 
    }
}

8. 結論

これで完了です。Spring BootアプリケーションからDynamoDBに接続できるようになりました。

もちろん、ローカルでのテストを完了した後、AWSでDynamoDBのライブインスタンスを透過的に使用し、わずかな構成変更のみでデプロイされたコードを実行できるようになります。

いつものように、この記事で使用されている例は、GitHubのサンプルプロジェクトとして入手できます。