Gestão de clientes com enriquecimento automático de endereço via ViaCEP, demonstrando aplicação prática de vários padrões de projeto dentro do ecossistema Spring.
Projeto de estudo (DIO Santander Bootcamp) para:
- Consolidar uso de Spring Boot 3 (Java 17) + Spring Data JPA + OpenFeign.
- Demonstrar padrões: Strategy, Singleton, Facade, Repository, (HTTP) Client como Proxy e Injeção de Dependência (IoC/DI).
- Expor documentação automática com OpenAPI (springdoc) e testar rapidamente via Swagger UI.
| Camada | Tecnologia |
|---|---|
| Linguagem | Java 17 |
| Framework Core | Spring Boot 3.5.4 |
| API REST | spring-boot-starter-web |
| Persistência | Spring Data JPA + H2 (em memória) |
| Cliente HTTP externo | Spring Cloud OpenFeign |
| Documentação | springdoc-openapi-starter-webmvc-ui |
| Testes | spring-boot-starter-test |
| Padrão | Onde / Como | Classe(s) Chave |
|---|---|---|
| Strategy | Definição de contrato de operações sobre Cliente | ClienteService (interface) + ClienteServiceImpl |
| Singleton | Beans Spring são singletons por padrão | ClienteServiceImpl, Repositories, ViaCepService |
| Facade | Controller expõe interface simples escondendo integrações (DB + ViaCEP) | ClienteRestController |
| Repository | Abstração de acesso a dados | ClienteRepository, EnderecoRepository |
| Proxy (HTTP Client) | Feign gera implementação dinâmica para chamada externa | ViaCepService (@FeignClient) |
| Inversão de Controle / DI | Injeção automática de dependências | @Autowired em ClienteServiceImpl |
POST /clientes
-> ClienteRestController (Facade)
-> ClienteService (Strategy)
-> ClienteServiceImpl
-> EnderecoRepository.findById(cep)
(miss) -> ViaCepService.consultarCep(cep) (Proxy Feign)
-> EnderecoRepository.save()
-> ClienteRepository.save()
src/main/java
└─ ...using_design_pattern_spring
├─ controller/ClienteRestController.java
├─ service/ (ClienteService, ViaCepService, impl/ClienteServiceImpl)
├─ repository/ (ClienteRepository, EnderecoRepository)
├─ model/ (Cliente, Endereco)
└─ config/OpenApiConfig.java
Base URL: http://localhost:8080
| Método | Rota | Descrição |
|---|---|---|
| GET | /clientes | Lista todos os clientes |
| GET | /clientes/{id} | Busca cliente por ID |
| POST | /clientes | Cria cliente (CEP buscado no ViaCEP) |
| PUT | /clientes/{id} | Atualiza dados do cliente (reprocessa CEP) |
| DELETE | /clientes/{id} | Remove cliente |
Envie no POST/PUT apenas o CEP dentro de endereco; os demais campos são preenchidos automaticamente.
{
"nome": "Maria Silva",
"endereco": { "cep": "01001000" }
}Resposta (exemplo simplificado):
{
"id": 1,
"nome": "Maria Silva",
"endereco": {
"cep": "01001000",
"logradouro": "Praça da Sé",
"bairro": "Sé",
"localidade": "São Paulo",
"uf": "SP",
"ddd": "11"
}
}# Criar cliente
Invoke-RestMethod -Uri http://localhost:8080/clientes -Method Post -Body '{"nome":"Maria","endereco":{"cep":"01001000"}}' -ContentType 'application/json'
# Listar
Invoke-RestMethod -Uri http://localhost:8080/clientes -Method GetApós subir a aplicação:
Metadados configurados em OpenApiConfig via @OpenAPIDefinition.
Pré-requisitos: Java 17 + Maven 3.9+
# (Opcional) Limpar build anterior
./mvnw.cmd clean
# Rodar aplicação
./mvnw.cmd spring-boot:runBanco H2 em memória – ao reiniciar, os dados são perdidos. (Você pode adicionar spring.h2.console.enabled=true e configs de datasource se desejar expor o console.)
- O CEP é a chave do
Endereco(evita duplicidade; múltiplos clientes referenciam o mesmo endereço). Optional.orElseGetevita chamada redundante à API ViaCEP quando CEP já está no cache (DB H2).- Nenhum DTO foi criado para manter foco nos padrões principais; em produção é recomendável separar modelos de domínio e transporte.
Julia Krisnarane – jkrisnarane@gmail.com
Se este projeto ajudou nos estudos, deixe uma estrela e evolua as sugestões! 💡