Desafio de Vaga Java Spring Boot: Mini CRM de Clientes e Contatos
Veja passo a passo como solucionar um desafio técnico real usando Java Spring Boot e construa seu mini CRM para se destacar em processos seletivos para desenvolvedor júnior.
Por que isso é importante
Desenvolver um mini CRM usando Java Spring Boot é uma das formas mais eficientes de demonstrar domínio dos fundamentos exigidos em desafios de vagas para desenvolvedor júnior. Essa prova prática avalia design de entidades, manipulação de relacionamentos e domínio das principais bibliotecas do ecossistema Spring, todos altamente valorizados em processos seletivos reais.
O Desafio: Contexto e Objetivo
O objetivo central é criar, do zero, uma API simples simulando um mini CRM — gerenciando clientes e seus contatos — utilizando a stack Java Spring Boot, uma das mais procuradas pelo mercado. Ideal para quem está entrando na área de desenvolvimento, o desafio elimina complexidade excessiva, foca no domínio do CRUD básico, modelagem de entidades relacionais e exposição de endpoints REST conforme padrões profissionais.
Requisitos: Modelagem e Funcionamento
O sistema precisa controlar duas entidades principais: Cliente (com ID, nome, e-mail) e Contato (ID, tipo, valor, cliente). A relação é de um para muitos: um cliente pode ter vários contatos. Tudo isso deve ser feito sem camadas intermediárias como DTO ou Service, para garantir aprendizado puro de controller e repositório.
⚠️Atenção
Não utilize camadas de serviço (service) ou transformação de objetos (DTO). A entrega dos dados será feita diretamente pelo corpo das entidades via request/response!
Stack e Dependências Utilizadas
Java 17+
Versão da linguagem para base do Spring Boot
Maven
Gerenciador de dependências do projeto Java
Spring Boot 3.5+
Framework para criação da API REST
Spring Web
Módulo para criação dos endpoints HTTP
Spring Data JPA
ORM de persistência e consultas
Banco H2
Banco de dados em memória, ideal para testes
Lombok
Simplifica geração de getters/setters/construtores
Spring Boot DevTools
Auto-reload e melhorias no dev
ℹ️Dica
Use o Spring Initializr para gerar rapidamente seu projeto e as dependências principais!
Passo a Passo: Montando o Projeto na Prática
spring.h2.console.enabled=true
).model
para as entidades e repository
para os repositórios JPA.Cliente
e Contato
com as anotações JPA/Lombok necessárias.ClienteRepository
e ContatoRepository
estendendo JpaRepository
.ClienteController
para expor endpoints POST e GET de clientes e contatos diretamente.@RequestBody
, @PathVariable
e @ResponseEntity
para recebimento/retorno dos dados e status HTTP corretos.❌Atenção
Proibido vincular contatos na criação do cliente! O contato é sempre cadastrado depois, usando o ID do cliente já existente.
Modelagem das Entidades: Cliente e Contato
O Cliente possui: ID (auto-incrementado), nome e e-mail; O Contato possui ID, tipo, valor e uma associação a um cliente. Use anotações @Entity
, @Table
, @Id
, @GeneratedValue
, @OneToMany
/@ManyToOne
conforme a direção do relacionamento. Recomenda-se fetch = FetchType.EAGER
no lado do cliente para carregar contatos juntos e LAZY
no contato.
✅Importante
Lembre-se de também colocar as anotações @JsonManagedReference
e @JsonBackReference
nos relacionamentos para evitar loops de serialização nas respostas JSON.
Endpoints REST: Estrutura Essencial
Rode sua API com os seguintes endpoints básicos:
201 Created
404
se o cliente não existir)⚠️Atenção ao Status HTTP
Use sempre ResponseEntity para controlar o status de resposta: 201 para criação, 200 para busca com sucesso e 404 quando não encontrado.
Comparando Abordagens para Vincular Contatos ao Cliente
POST /clientes/{id}/contatos
Contato criado passando ID do cliente na URL via PathVariable.
Prós
- URL clara e intuitiva
- Facilita identificação do cliente
- Adere a boas práticas REST
Contras
- Pouco flexível para casos futuros de múltipla associação
POST /contatos?clienteId=
Contato criado usando request param na query string.
Prós
- Facilita consumo via formulários simples
- Menos verbosidade na rota
Contras
- Menos intuitivo em APIs RESTful
- Pode confundir em rotas semânticas
✅Recomendação
Prefira a abordagem POST /clientes/{id}/contatos; ela segue o padrão de agrupamento de recursos e deixa o endpoint mais semântico.
Testando Endpoints: Boas Práticas e Cuidados
Use funcionalidades da IDE, ferramentas como Postman, Insomnia ou até o próprio console do H2 para criar, buscar e validar as respostas dos endpoints. Garanta que cada resposta HTTP está correta, e que buscas por cliente inexistente retornam 404.
⚠️Atenção
Não deixe dados mockados em código: teste sempre trabalhando com a requisição HTTP real, simulando uso na prática!
Critérios de Avaliação em Desafios de Vaga
O desafio avaliará:
- Modelagem correta das entidades (relacionamentos e integridade)
- Endpoints REST funcionais e claros
- Status HTTP adequados nas respostas
- Boas práticas no código, evitando anti-patterns
ℹ️Atenção ao Detalhe
Capriche na nomeação de métodos, rotas, campos e comentários. A clareza conta pontos!
Pontas Extras: Diferenciais e Melhoria
Para além do básico, você pode surpreender adicionando validações simples com @NotNull
, mensagens de erro amigáveis, e organização do código pensando em fácil escalabilidade (ex: modularização dos packages). Use o Lombok moderadamente e mantenha o foco na robustez e clareza.
⚠️Cuidado
Não aumente a complexidade com patterns ou recursos avançados: respeite sempre o escopo júnior quando indicado no desafio!
Conclusão: Pronto para Desafios de Vaga com Java?
Seguindo este guia, você demonstrará domínio prático de CRUD com relacionamentos em Java Spring Boot, manipulando endpoints REST, entendendo erros e aplicando boas práticas essenciais. Este tipo de entrega sólida aumenta sua visibilidade entre recrutadores e prepara para desafios ainda mais complexos em back-end.
✅Dica para sua entrevista
Tenha o código rodando em local ou repositório público (ex: GitHub) e prepare explicações claras sobre decisões de modelagem e arquitetura.