Springデータを使用したSpringBootアプリケーションのDynamoDB
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のローカルインスタンスにアクセスする場合、これらのフィールドにはいくつかの値を入力する必要がありますが、実際に認証する必要はありません。
プロパティは、 Springconfigのapplication.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つの属性を含むアイテムを含むテーブルを表します。
- ID
- 希望小売価格
- 料金
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のサンプルプロジェクトとして入手できます。