DynamoDB dalam Aplikasi Spring Boot Menggunakan Spring Data

1. Gambaran keseluruhan

Dalam artikel ini, kami akan meneroka asas-asas mengintegrasikan DynamoDB ke dalam Spring Boot Application dengan projek praktikal praktikal.

Kami akan menunjukkan cara mengkonfigurasi aplikasi untuk menggunakan instance DynamoDB tempatan menggunakan Spring Data. Kami juga akan membuat contoh model data dan kelas repositori serta melakukan operasi pangkalan data sebenar menggunakan ujian integrasi.

2. DynamoDB

DynamoDB adalah pangkalan data NoSQL yang dihoskan sepenuhnya di AWS, sama seperti pangkalan data NoSQL lain seperti Cassandra atau MongoDB. DynamoDB menawarkan prestasi yang pantas, konsisten dan dapat diramalkan dan dapat ditingkatkan secara besar-besaran.

Anda boleh mengetahui lebih lanjut mengenai DynamoDB pada Dokumentasi AWS.

Mari pasang contoh tempatan DynamoDB untuk mengelakkan daripada menanggung kos menjalankan siaran langsung.

Untuk pembangunan, menjalankan DynamoDB secara tempatan lebih masuk akal daripada menjalankan AWS; contoh tempatan akan dijalankan sebagai fail JAR yang boleh dilaksanakan.

Anda boleh mendapatkan arahan mengenai cara menjalankan DynamoDB secara tempatan di sini.

3. Pergantungan Maven

Tambahkan kebergantungan berikut untuk mula bekerja dengan DynamoDB menggunakan Spring Data:

  • JPA Spring Data
  • AWS Java SDK DynamoDB
  • Modul Komuniti Spring Data DynamoDB
   org.springframework.data spring-data-releasetrain Lovelace-SR16 pom import      com.amazonaws aws-java-sdk-dynamodb 1.11.64   com.github.derjust spring-data-dynamodb 5.1.0   

Lihat Spring Data Release Train, AWS Java SDK For Amazon DynamoDB, dan Spring Data DynamoDB untuk versi terkini di atas.

4. Konfigurasi

Seterusnya, mari tentukan sifat berikut dalam fail application.properties :

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

Akses dan kunci rahsia yang disenaraikan di atas hanyalah nilai sewenang-wenang untuk konfigurasi tempatan anda. Semasa mengakses contoh DynamoDB tempatan, medan ini perlu diisi oleh beberapa nilai tetapi tidak diperlukan untuk benar-benar mengesahkan.

Properti akan ditarik keluar secara dinamik dari fail application.properties di Spring config :

@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. Model Data

Sekarang mari kita buat model POJO untuk mewakili data yang disimpan di DynamoDB.

POJO ini akan menggunakan anotasi yang serupa dengan yang digunakan dalam Hibernate untuk menentukan nama jadual, atribut, kunci dan aspek lain dari jadual.

5.1. Atribut Model Data

Kelas berikut, ProductInfo , mewakili jadual dengan item yang mengandungi 3 atribut:

  1. ID
  2. MSRP
  3. Kos

5.2 Kelas Model Data Java

Mari buat fail bernama ProductInfo.java dalam folder model data anda:

@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 Repositori

Seterusnya, kita perlu membuat antara muka ProductRepository untuk menentukan fungsi CRUD yang ingin kita bina. Repositori yang digunakan untuk membaca dan mengekalkan data ke dan dari DynamoDB akan melaksanakan antara muka ini:

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

7. Ujian Integrasi

Seterusnya, mari buat ujian integrasi untuk memastikan kita berjaya menyambung ke contoh tempatan DynamoDB:

@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration @ActiveProfiles("local") @TestPropertySource(properties = { "amazon.dynamodb.endpoint=//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 givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE); repository.save(productInfo); List result = (List) repository.findAll(); assertThat(result.size(), is(greaterThan(0))); assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); } } 

8. Kesimpulannya

Dan kami selesai - kini kami dapat menyambung ke DynamoDB dari Spring Boot Application .

Sudah tentu, setelah selesai menguji secara tempatan, kita seharusnya dapat secara transparan menggunakan tayangan langsung DynamoDB di AWS dan menjalankan kod yang digunakan dengan hanya perubahan konfigurasi kecil.

Seperti biasa, contoh yang digunakan dalam artikel ini tersedia sebagai contoh projek di GitHub.