An Interest In:
Web News this Week
- April 19, 2024
- April 18, 2024
- April 17, 2024
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
Desacoplando a camada de domnio de uma aplicao das outras camadas - parte 2
Ferramentas necessrias:
- Java SDK
- Docker
- Postman
- Ide de sua preferencia
- Ter concludo a Parte 1
Vamos agora fazer a transio da nossa aplicao do banco de dados Postgres para DynamoDb, para isso precisamos adicionar as dependncias referente ao DynamoDb e retirar as dependncias referente ao Postgres em nosso arquivo pom.xml que devera ficar assim.pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>ddd</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ddd</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.11.614</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.github.derjust</groupId> <artifactId>spring-data-dynamodb</artifactId> <version>5.1.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build></project>
Vamos modificar tambm nosso arquivo application.properties
para deixar apenas o endpoint de acesso ao nosso banco de dados DynamoDb.application.properties
server.error.include-message=alwaysaws.amazonDynamoDBEndpoint=http://localhost:8000
Rode o seguinte comando em seu terminal CMD para criar um banco de dados AWS/DynamoDb dentro de um container docker.
docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb
Vamos agora fazer a transio do armazenamento da nossa aplicao de Postgres para DynamoDb, para isso s precisaremos alterar nossa classe UsuarioAbstractRepositoryDB
,mapear nossa tabela dynamoDb na classe Usuario
e criar uma classe de configurao de acesso ao Aws/DynamoDb.
Dentro do package infrastructure
crie um pakage config
e dentro dele um package dynamodb
, dentro do package dynamodb crie a classe de configurao DynamoDbConfig
.DynamoDbConfig
import com.amazonaws.client.builder.AwsClientBuilder;import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;import com.amazonaws.services.dynamodbv2.util.TableUtils;import com.example.ddd.core.usuario.Usuario;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class DynamoDbConfig { @Value(("${aws.amazonDynamoDBEndpoint}")) private String amazonDynamoDBEndpoint; @Bean public DynamoDBMapper dynamoDBMapper() { AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(amazonDynamoDBEndpoint, "us-west-2")) .build(); DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER) .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT) .withTableNameOverride(null) .withPaginationLoadingStrategy(DynamoDBMapperConfig.PaginationLoadingStrategy.EAGER_LOADING) .build(); DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(client, mapperConfig); init(dynamoDBMapper, client); return dynamoDBMapper; } public void init(DynamoDBMapper dynamoDBMapper, AmazonDynamoDB client) { CreateTableRequest tableRequest = dynamoDBMapper.generateCreateTableRequest(Usuario.class); tableRequest.setProvisionedThroughput(new ProvisionedThroughput(1L, 1L)); if (TableUtils.createTableIfNotExists(client, tableRequest)) { System.out.println("Table created"); } }}
Altere a classe UsuarioAbstractRepositoryDB
para mtodos que iro acessar o dynamoDb e armazenar ou retornar os dados que precisamos.UsuarioAbstractRepositoryDB
import java.util.List;@Repositorypublic class UsuarioAbstractRepositoryDB { private DynamoDBMapper dynamoDBMapper; @Autowired public UsuarioAbstractRepositoryDB(DynamoDBMapper dynamoDBMapper) { this.dynamoDBMapper = dynamoDBMapper; } public Usuario buscaUsuarioPorId(String usuarioId) { return dynamoDBMapper.load(Usuario.class, usuarioId); } public List<Usuario> buscaUsuarios() { final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression(); final PaginatedScanList<Usuario> usuarioList = dynamoDBMapper.scan(Usuario.class, paginatedScanListExpression); return usuarioList; } public String deletaUsuario(String usuarioId){ Usuario usuario = dynamoDBMapper.load(Usuario.class,usuarioId); dynamoDBMapper.delete(usuario); return "Usuario deletado com sucesso"; } public Usuario criaUsuario(Usuario usuario) { dynamoDBMapper.save(usuario); return usuario; } public Usuario updateUsuario(String usuarioId, Usuario usuario) { dynamoDBMapper.save(usuario, new DynamoDBSaveExpression() .withExpectedEntry("usuarioId", new ExpectedAttributeValue( new AttributeValue().withS(usuarioId) ))); Usuario usuarioAtualizado = buscaUsuarioPorId(usuarioId); return usuarioAtualizado; }}
Agora so precisamos mapear a criao da nossa entidade usuario dentro do banco de dados dynamoDb, para isso altere a classe Usuario
da seguinte forma.Usuario
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;@DynamoDBTable(tableName = "usuario")public class Usuario { @DynamoDBHashKey(attributeName = "usuarioId") @DynamoDBAutoGeneratedKey private String userId; @DynamoDBAttribute(attributeName = "name") private String name; @DynamoDBAttribute(attributeName = "email") private String email; @DynamoDBAttribute(attributeName = "cpf") private String cpf; @Deprecated public Usuario() { } public Usuario(String name, String email, String cpf) { this.name = name; this.email = email; this.cpf = cpf; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getName() { return name; } public String getEmail() { return email; } public String getCpf() { return cpf; } public void setName(String name) { this.name = name; } public void setEmail(String email) { this.email = email; } public void setCpf(String cpf) { this.cpf = cpf; }}
E pronto, transio realizada sem precisar mexer na camada de domnio ou na camada de acesso externo de nossa aplicao, podemos rodar nossa aplicao e testar via Postman
.
Usuario criado
Lista Usuario
Usuario Armazenado DynamoDB
E isso ai galera, essa ultima parte deixarei no meu github para quem quiser acessar
Deixo aqui tambm meu linkedin para quem quiser me adicionar, grato a todos que leram este artigo e bora aprender galera.
Original Link: https://dev.to/2020nani/desacoplando-a-camada-de-dominio-de-uma-aplicacao-das-outras-camadas-parte-2-1fkh
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To