Springデータを使用したSpring BootアプリケーションでのDynamoDB

Springデータを使用したSpringブートアプリケーションでのDynamoDB

1. 概要

この記事では、we’ll explore the basics of integrating DynamoDB into a Spring Boot Applicationと実践的な実用的なサンプルプロジェクトを紹介します。

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

2. DynamoDB

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

DynamoDBの詳細については、AWS Documentationを参照してください。

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

開発では、DynamoDBをローカルで実行する方がAWSで実行するよりも意味があります。ローカルインスタンスは実行可能なJARファイルとして実行されます。

run DynamoDB locally hereの方法についての説明があります。

3. Mavenの依存関係

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


    
    
        org.springframework.data
        spring-data-releasetrain
        Hopper-SR10
        pom
        import
        
    


    
        com.amazonaws
        aws-java-sdk-dynamodb
        1.11.34
    
    
        com.github.derjust
        spring-data-dynamodb
        4.3.1
    

4. 設定

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

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

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

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

@Configuration
@EnableDynamoDBRepositories
  (basePackages = "com.example.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. MSRP

  3. Cost

5.2 Java Data Model Class

データモデルフォルダに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リポジトリ

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

@EnableScan
public interface ProductInfoRepository extends
  CrudRepository {

    List 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)repository.findAll());
    }

    @Test
    public void sampleTestCase() {
        ProductInfo dave = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
        ProductInfoRepository.save(dave);

        List result
          = (List) repository.findAll();

        assertTrue("Not empty", result.size() > 0);
        assertTrue("Contains item with expected cost",
          result.get(0).getCost().equals(EXPECTED_COST));
    }
}

8. 結論

これで完了です。connect to DynamoDB from a Spring Boot Applicationを実行できるようになりました。

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

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