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 configのapplication.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つの属性を含むアイテムを持つテーブルを表します。
-
ID
-
MSRP
-
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として利用できます。