DynamoDB dans une application de démarrage Spring utilisant des données Spring

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:

  1. ID

  2. MSRP

  3. 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.