DynamoDB dans une application de démarrage Spring utilisant des données Spring
1. Vue d'ensemble
Dans cet article,we’ll explore the basics of integrating DynamoDB into a Spring Boot Application avec un exemple de projet pratique.
Nous montrerons comment configurer une application pour utiliser une instance DynamoDB locale à l'aide de Spring Data. Nous allons également créer un exemple de modèle de données et de classe de référentiel et effectuer des opérations de base de données réelles à l'aide d'un test d'intégration.
2. DynamoDB
DynamoDB est une base de données NoSQL hébergée entièrement gérée sur AWS, similaire à d'autres bases de données NoSQL telles que Cassandra ou MongoDB. DynamoDB offre des performances rapides, cohérentes et prévisibles et est extrêmement évolutif.
Vous pouvez en savoir plus sur DynamoDB sur lesAWS Documentation.
Installonsa local instance of DynamoDB pour éviter d’engendrer le coût d’exécution d’une instance active.
Pour le développement, exécuter DynamoDB localement est plus logique que d’exécuter sur AWS; l'instance locale sera exécutée en tant que fichier JAR exécutable.
Vous pouvez trouver des instructions sur la façon derun DynamoDB locally here.
3. Dépendances Maven
Ajoutez les dépendances suivantes pour commencer à utiliser DynamoDB à l'aide de Spring Data:
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. Configuration
Ensuite, définissons les propriétés suivantes dans le fichierapplication.properties:
amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=key
amazon.aws.secretkey=key2
Les clés d'accès et secrètes répertoriées ci-dessus ne sont que des valeurs arbitraires pour votre configuration locale. Lors de l'accès à une instance locale de DynamoDB, ces champs doivent être renseignés par certaines valeurs, mais ils ne sont pas nécessaires pour s'authentifier.
Les propriétés seront extraites dynamiquement du fichierapplication.properties dansthe Spring config:
@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. Le modèle de données
Créons maintenant un modèle POJO pour représenter les données stockées dans DynamoDB.
Ce POJO utilisera des annotations similaires à celles utilisées dans Hibernate pour définir le nom de la table, les attributs, les clés et d’autres aspects de la table.
5.1. Attributs du modèle de données
La classe suivante,ProductInfo, représente une table avec des éléments contenant 3 attributs:
-
ID
-
MSRP
-
Cost
5.2 Java Data Model Class
Créons un fichier appeléProductInfo.java dans votre dossier de modèle de données:
@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. Dépôt CRUD
Ensuite, nous devons créer une interfaceProductRepository pour définir la fonctionnalité CRUD que nous voulons développer. Les référentiels utilisés pour lire et conserver les données depuis et vers DynamoDB implémenteront cette interface:
@EnableScan
public interface ProductInfoRepository extends
CrudRepository {
List findById(String id);
}
7. Test d'intégration
Ensuite, créons un test d'intégration pour nous assurer que nous pouvons nous connecter avec succès à l'instance locale de 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. Conclusion
Et nous avons terminé - nous pouvons maintenantconnect to DynamoDB from a Spring Boot Application.
Bien sûr, une fois les tests localement terminés, nous devrions être en mesure d'utiliser de manière transparente une instance active de DynamoDB sur AWS et d'exécuter le code déployé avec uniquement des modifications mineures de la configuration.
Comme toujours, l'exemple utilisé dans cet article est disponible comme exemple de projetover on GitHub.